Мой запрос:
SELECT * FROM table WHERE id IN (1,2,3,4);
Я использую его для групп пользователей, и пользователь может входить в несколько групп. но кажется, что когда запись имеет несколько идентификаторов, таких как 1 и 3, mySQL не возвращает эту строку.
Есть ли способ получить и эту строку?
id
как список, разделенный запятыми, или что-то в этом роде, из вашего запроса будет возвращено несколько строк .id
: varchar, set или enum?netcase
вместо@user762683
?Ответы:
Ваш запрос переводится на
SELECT * FROM table WHERE id='1' or id='2' or id='3' or id='4';
Он вернет только те результаты, которые ему соответствуют.
Одним из способов решения этой проблемы, чтобы избежать сложности, было бы изменение типа данных на
SET
. Тогда вы можете использовать FIND_IN_SETSELECT * FROM table WHERE FIND_IN_SET('1', id);
источник
У вас неправильный дизайн базы данных, и вам следует найти время, чтобы прочитать что-нибудь о нормализации базы данных ( 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 | ---------------------- | ...
Затем вы можете легко выбрать всех пользователей с назначенной группой, или всех пользователей в группе, или все группы пользователей, или что угодно. Кроме того, ваш 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, с которым можно поиграть.
источник
у вас должна быть запись в таблице или запись массива в базе данных.
пример:
SELECT * FROM tabel_record WHERE table_record.fieldName IN (SELECT fieldName FROM table_reference);
источник
IN (1,2,3,4)
совершенно верно. Кроме того, я не понимаю, как это объясняет, что «когда запись имеет несколько идентификаторов, таких как 1 и 3, mySQL не возвращает эту строку» в вопросе.