MySQL ДЕ В ()


84

Мій запит:

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

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

Чи є спосіб отримати цей рядок теж?


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

1
ну це список, відокремлений комами, наприклад => 3,4 MySQL не повертає. Я бачу проблему, справа в комі, але як я міг це зробити?
netcase 16.03.12

1
@ user762683, Будь ласка, використовуйте правильне ім'я профілю? і який тип даних цього id, varchar, набору чи переліку?
Starx,

1
@Starx Якою вашою справою є ім’я профілю, яке хтось використовує?
Michael Berkowski

1
@Michael, подивіться, наскільки легко та правильно звуки відповідають OP netcaseзамість @user762683?
Starx

Відповіді:


82

Ваш запит перекладається на

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, з яким можна пограти.


1

ви повинні мати запис у таблиці або запис масиву в базі даних.

приклад:

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

Підвибір не потрібно. IN (1,2,3,4)цілком дійсний. Крім того, я не розумію, як це пояснює "коли запис має кілька ідентифікаторів, таких як 1 і 3, mySQL не повертає цей рядок" у Запитанні.
Скратт,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.