Подтвердить что ты не робот

MySQL WHERE IN()

Мой запрос:

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

У вас неправильный дизайн базы данных, и вы должны потратить некоторое время, чтобы что-то прочитать о нормализации базы данных (wikipedia/fooobar.com/info/13227/...).

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

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       |
----------------------
| ...      

Затем вы можете легко выбрать всех пользователей с назначенной группой или всех пользователей в группе или всех групп пользователей или что бы вы ни думали. Кроме того, ваш 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, чтобы играть с.