我的查詢是:MySQL的WHERE IN()
SELECT * FROM table WHERE id IN (1,2,3,4);
我用它和用戶組,用戶可以在多個組。但似乎當一條記錄具有多個id,如1和3時,mySQL不會返回該行。
有什麼辦法可以得到那一行嗎?
我的查詢是:MySQL的WHERE IN()
SELECT * FROM table WHERE id IN (1,2,3,4);
我用它和用戶組,用戶可以在多個組。但似乎當一條記錄具有多個id,如1和3時,mySQL不會返回該行。
有什麼辦法可以得到那一行嗎?
您的查詢翻譯成
SELECT * FROM table WHERE id='1' or id='2' or id='3' or id='4';
它只會返回與之匹配的結果。
解決它的一種方法避免了複雜性,將數據類型改爲SET
。 然後,你可以使用,FIND_IN_SET
SELECT * FROM table WHERE FIND_IN_SET('1', id);
無法重現任何錯誤。請求的查詢適用於我。我使用列出的ID從'table'中獲得所有記錄。 – 2015-01-11 15:03:41
你有錯誤的數據庫設計,你應該花時間閱讀一些有關數據庫標準化(wikipedia/stackoverflow)。
我假設你的表看起來有點像這個
TABLE
================================
| group_id | user_ids | name |
--------------------------------
| 1 | 1,4,6 | group1 |
--------------------------------
| 2 | 4,5,1 | group2 |
所以在你的用戶羣的表中,每一行代表一個組和user_ids
列已設置分配給該組的用戶ID。
標準化該表的版本是這樣的
GROUP
=====================
| id | name |
---------------------
| 1 | group1 |
---------------------
| 2 | group2 |
GROUP_USER_ASSIGNMENT
======================
| group_id | user_id |
----------------------
| 1 | 1 |
----------------------
| 1 | 4 |
----------------------
| 1 | 6 |
----------------------
| 2 | 4 |
----------------------
| ...
然後你就可以很容易地選擇與分配組的所有用戶,或組的所有用戶,或者用戶的所有羣體,或任何你能想到的的。此外,您的SQL查詢將工作:
/* Your query to select assignments */
SELECT * FROM `group_user_assignment` WHERE user_id IN (1,2,3,4);
/* Select only some users */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE user_id IN (1,4);
/* Select all groups of user */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE t1.`user_id` = 1;
/* Select all users of group */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE t1.`group_id` = 1;
/* Count number of groups user is in */
SELECT COUNT(*) AS `groups_count` FROM `group_user_assignment` WHERE `user_id` = 1;
/* Count number of users in group */
SELECT COUNT(*) AS `users_count` FROM `group_user_assignment` WHERE `group_id` = 1;
這樣,它也將易於更新數據庫,當你想添加新的任務,你只需簡單地在group_user_assignment
插入新行,當你想刪除分配你只需刪除group_user_assignment
中的行。
在您的數據庫設計中,要更新分配,您必須從數據庫中獲取您的分配集,對其進行處理並更新,然後將其寫回數據庫。
這裏是sqlFiddle玩。
請發佈一個不正確地從這個查詢返回的行的例子。假設你沒有將'id'作爲逗號分隔的列表存儲,你的查詢會返回多行_will_。 – 2012-03-16 11:20:18
它是一個逗號分隔列表,例如=> 3,4不會由mySQL返回。我看到問題,這是關於逗號,但我怎麼能這樣做? – netcase 2012-03-16 11:23:54
@ user762683,請使用正確的配置文件名稱?這個'id',varchar或set或enum的數據類型是什麼? – Starx 2012-03-16 11:25:48