Вы неправильно дизайн базы данных, и вы должны взять время, чтобы прочитать что-то о нормализации баз данных (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, чтобы игратьтировав.
Пожалуйста, разместите пример строк, которые не возвращаются должным образом из этого запроса. Предполагая, что вы не храните 'id' в виде списка, разделенного запятыми, или что-то еще, несколько строк _will_ возвращаются из вашего запроса. –
ну, это разделенный запятой список, например => 3,4 не будет возвращен mySQL. Я вижу проблему, речь идет о запятой, но как я могу это сделать? – netcase
@ user762683, пожалуйста, используйте правильное имя профиля? и каков тип данных этого 'id', varchar или set или enum? – Starx