2010-07-13 25 views
1

我存儲字段內的ID列表(按列表我的意思是val1,val2,val3,... ),並且我想從列表中字段有valX的表中選擇行。mysql:如果一個數字在列表字段中選擇行(即userIDs =「1,2,3」,從表中選擇*,其中1在userIDs中)

我認爲這會工作,但顯然不是:(

SELECT * 
    FROM userbulletins 
WHERE 25 IN `currentMessages` 
    OR 25 IN `removedMessages` 
    OR 25 IN `readMessages` 

currentMessages,removedMessages和readMessages與IDS領域的存儲列表

我也試過

SELECT * 
FROM userbulletins 
WHERE "25" IN(`currentMessages`) 

都沒有返回任何東西(並且應該在我的測試數據庫中返回1行)

任何想法我做錯了什麼?或者如果這甚至是可能的? 謝謝!

回答

6

如果我理解正確,你有一個非規範化表,其中currentMessages值可以是「val1,val2,val3,...」,並且你想查找其中25是其中一個值的行嗎?如果是這樣,使用FIND_IN_SET function

WHERE FIND_IN_SET('25', `currentMessages`) > 0 
    OR FIND_IN_SET('25', `removedMessages`) > 0 
    OR FIND_IN_SET('25', `readMessages`) > 0 

...但我真的建議你正常化的數據進行查詢更加容易。

+0

我想過正常化它,但網站是如此之大以至於爲此添加三張表似乎是矯枉過正。那將意味着比現在更多的三張桌子;每一個用於當前,刪除和閱讀消息。感謝您的解決方案! – Garrett 2010-07-15 13:02:09

2

您可以使用FIND_IN_SET用於此目的:

SELECT * 
FROM userbulletins 
WHERE FIND_IN_SET("25", `currentMessages`) 

這也將是值得考慮的,如果不同的設計會更好,你不必在一個單元格值的列表。我建議你閱讀這篇關於first normal form的維基百科文章。

0

這是因爲IN不能這樣工作。 In用於指定的值列表或由子查詢產生的列表。

要麼你得有表示爲一個字符串currentMessages,在這種情況下WHERE currentMessages LIKE '%|25|%' OR currentMessage LIKE '25|%' OR currentMessage LIKE '%|25' OR currentMessage = '25'將亂七八糟的工作,或者你必須有另一個表(或其中的一些),這樣它的

SELECT * FROM userbulletins 
    WHERE 25 IN (SELECT * FROM `currentMessages` WHERE....) 

- 在這種情況下,我會建議消息(id,[標題,內容,無論],狀態{current,removed,read})

fakeEDIT:FIND_IN_SET的解決方案比我的LIKE選項好,但我仍然建議使用表格。

相關問題