MySQL ГДЕ В ()


87

Мой запрос:

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

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

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


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

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

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

1
@Starx Какое ваше дело - имя профиля, которое кто-то использует?
Майкл Берковски

1
@Michael, см. Насколько просто и правильно звуки соответствовать OP as netcaseвместо @user762683?
Starx

Ответы:


85

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

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

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

39

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


2

у вас должна быть запись в таблице или запись массива в базе данных.

пример:

SELECT * FROM tabel_record
WHERE table_record.fieldName IN (SELECT fieldName FROM table_reference);

Подзапрос не требуется. IN (1,2,3,4)совершенно верно. Кроме того, я не понимаю, как это объясняет, что «когда запись имеет несколько идентификаторов, таких как 1 и 3, mySQL не возвращает эту строку» в вопросе.
Scratte
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.