mysql SELECT IN, за которым следует разделенное запятыми поле - PullRequest
5 голосов
/ 23 февраля 2012

Я использую mySQL, и у меня есть таблица членов с BLOB-полем «контакты», содержащая список разделенных запятыми идентификаторов других участников:

TABLE members:
id_member = 1
firstname = 'John'
contacts (BLOB) = '4,6,7,2,5'

Я хочу получить все имена в списке контактов одного человека с помощью одного запроса. Я попробовал следующее:

SELECT firstname from members WHERE id_member IN ( SELECT contacts FROM members WHERE id_member = 1 );

Возвращает только одну строку, но когда я пытаюсь:

SELECT firstname from members WHERE id_member IN ( 4,6,7,2,5 );

Возвращает все имена из списка. Я могу использовать два запроса для достижения этой цели, но я решил проверить, есть ли способ заставить его работать с одним простым, элегантным запросом.

Спасибо за чтение, любая помощь приветствуется. Июль

Ответы [ 3 ]

6 голосов
/ 23 февраля 2012

Это похоже на очень плохой дизайн стола. Можно ли это изменить?

Если вы не можете изменить дизайн, тогда вы можете обрабатывать значения через запятую в MySQL, используя FIND_IN_SET, но он не сможет эффективно использовать индексы:

SELECT firstname
FROM members
WHERE FIND_IN_SET(id_member, (SELECT contacts FROM members WHERE id_member = 1))

Но вместо того, чтобы идти по этому пути, я бы настоятельно рекомендовал, если это возможно, нормализовать вашу базу данных . Попробуйте использовать таблицу соединений вместо списка через запятую. Затем вы можете найти нужные записи с помощью объединений, и поиск сможет использовать индекс.

3 голосов
/ 23 февраля 2012

Если вы используете столбец с сериализованным типом BLOB для хранения этих значений, то вы не сможете делать то, что хотите.Более дружественный к SQL подход заключается в создании таблицы отношений, которая может использоваться как часть операции JOIN, например, таблицы member_contacts, которая имеет связь между одним значением id_member и некоторым другим.

Расширение списка, разделенного запятыми, на отдельные записи - довольно простой механический процесс.

2 голосов
/ 23 февраля 2012

Можете ли вы изменить эту структуру БД? Поле контактов действительно должно быть связанной таблицей, а не столбцом. Предполагая таблицу контактов с такой структурой:

id_contact
id_member

Тогда вы бы использовали EXISTS вместо:

SELECT firstname from members m WHERE EXISTS (SELECT 1 FROM contacts c WHERE c.id_contact = m.id_member );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...