2011-11-11 40 views
2

我知道我可以使用IN(1,2,3)從SQL數據庫中選擇其值爲1,2或3的項目,但如果我在MYSQL中有一個值是字符串,並且是等於'1,2,3',我想選擇該值。據我知道,我必須這樣做:如何在sql中存儲然後通過CSV進行搜索?

SELECT whatever FROM wherever WHERE sqlvariable = '1' OR sqlvariable LIKE '1,%' OR `sqlvariable` LIKE '%,1,%' OR `sqlvariable` LIKE '%,1' 

,如果我想在反向模擬「IN」之類的也可以。但可以說,我想選擇sqlvariable其含有1或2,那麼,我必須這樣做:

SELECT whatever FROM wherever WHERE sqlvariable = '1' OR sqlvariable LIKE '1,%' OR `sqlvariable` LIKE '%,1,%' OR `sqlvariable` LIKE '%,1' OR sqlvariable = '2' OR sqlvariable LIKE '2,%' OR `sqlvariable` LIKE '%,2,%' OR `sqlvariable` LIKE '%,2' 

現在可以說,我用PHP產生上述疑問,我希望找到sqlvariable哪裏它包含1 2 4 66 34 33 22 44或992.這個查詢運行需要很長時間。

我可以做一個按位執行,但然後我只限於只有約60個不同的項目左右,這是不夠的。

有沒有更快的方式來利用上述在sql中的CSV查詢?我想這有點像IN(),但是相反。

+0

我當然希望你沒有實際存儲CSV你的SQL數據庫中的字符串!如果你是的話,我希望你能說服你的老闆或者DBA更聰明一些,並且在* store *之前解析* .csv文件。 – paulsm4

+0

我沒有老闆,我只是一個加拿大男子試圖學習先生:P感謝您的意見,但我的確在嘗試學習更好的方法來將數組存儲在數據庫中。我知道vBulletin論壇存儲例如權限組信息作爲字符串CSV。例如,vbulletin論壇上的權限變量看起來像'1,2,3',其中每個數字表示不同的權限組。應該如何做得更好? – Macmee

回答

4

可以使用FIND_IN_SET簡化您的疑問:

SELECT whatever 
FROM wherever 
WHERE FIND_IN_SET('1', sqlvariable) 
OR  FIND_IN_SET('2', sqlvariable) 

然而,這仍然需要在表格中查找每一行。重新設計數據庫會更好,因此不需要CSV格式的數據。


更新:您現有的設計看起來是這樣的:

groupname groupmembers 
Group1  1,2,3 
Group2  3,4 

你應該改變它的東西更像是這樣的:

groupid groupmember 
1   1 
1   2 
1   3 
2   3 
2   4 
+0

謝謝!我怎麼能重新設計我的桌子。我有一個表將用戶分組到不同的用戶組。要存儲屬於用戶組的用戶列表,現在我有一個包含兩個值的表'groupname','groupmembers'。由於有時會有超過100個用戶在組中,我不確定如何存儲它們,而不是使用CSV,並將類似'1,2,3,4,5,6'的值作爲每個數字代表用戶的組成員的值。 – Macmee

相關問題