2012-03-16 2 views
48

Мой запрос:MySQL WHERE IN()

SELECT * FROM table WHERE id IN (1,2,3,4);

Я использую его для групп пользователей, и пользователь может быть более чем в одной группе. но кажется, что когда в записи есть несколько идентификаторов, подобных 1 и 3, mySQL не возвращает эту строку.

Есть ли способ получить эту строку?

+6

Пожалуйста, разместите пример строк, которые не возвращаются должным образом из этого запроса. Предполагая, что вы не храните 'id' в виде списка, разделенного запятыми, или что-то еще, несколько строк _will_ возвращаются из вашего запроса. –

+1

ну, это разделенный запятой список, например => 3,4 не будет возвращен mySQL. Я вижу проблему, речь идет о запятой, но как я могу это сделать? – netcase

+0

@ user762683, пожалуйста, используйте правильное имя профиля? и каков тип данных этого 'id', varchar или set или enum? – Starx

ответ

52

Ваш запрос переводится

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); 
+0

Невозможно воспроизвести ошибку. Запрошенный запрос работает для меня. Я получаю ВСЕ записи из «таблицы» с указанными идентификаторами. –

22

Вы неправильно дизайн базы данных, и вы должны взять время, чтобы прочитать что-то о нормализации баз данных (wikipedia/stackoverflow).

Я предполагаю, что ваша таблица выглядит как этот

TABLE 
================================ 
| group_id | user_ids | name | 
-------------------------------- 
| 1  | 1,4,6 | group1 | 
-------------------------------- 
| 2  | 4,5,1 | group2 |  

так в вашей таблице групп пользователей, каждая строка представляет собой одну группу и в user_ids столбце имеет множество пользовательских идентификаторов, назначенные эту группу.

Нормированная версия этой таблицы будет выглядеть следующим образом

GROUP 
===================== 
| id  | name | 
--------------------- 
| 1  | group1 | 
--------------------- 
| 2  | group2 |  

GROUP_USER_ASSIGNMENT 
====================== 
| group_id | user_id | 
---------------------- 
| 1  | 1  | 
---------------------- 
| 1  | 4  | 
---------------------- 
| 1  | 6  | 
---------------------- 
| 2  | 4  | 
---------------------- 
| ...  

Затем вы можете легко выбрать всех пользователей с присвоенной группы или всех пользователей в группе, или все группы пользователя или все, что вы можете думать из. Кроме того, ваш запрос будет работать:

/* 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, чтобы игратьтировав.