2016-03-16 5 views
0

Я пытаюсь использовать это соединение для возврата нескольких строк идентификатора пользователя, где они находятся в списке получателей из определенной строки в другой таблице.MySQL JOIN возвращает только первое совпадение

SELECT a.`USER_ID` 
FROM Users a 
INNER JOIN Lists b ON a.`USER_ID` = b.`RECIP` 
WHERE a.`PARENT` = '1' 
AND b.`LIST_ID` = '210' 

Запрос выше должен возвращать 5 строк, как есть 5 матчей в RECIP, но я только видя 1 результат, который является первым матчем в RECIP

В таблице «Lists», строки LIST_ID «210» сабельные содержит '22, 33,40,42,45' Таким образом, я надеялся, что запрос возвратит 5 строк из таблицы „Пользователи“, как все эти USER_ID существуют-х:

USER_ID 22

USER_ID 33

USER_ID 40

USER_ID 42

USER_ID 45

Но я получаю только один результат:

USER_ID 22

Я попробовал несколько вещей (SELECT DISTINCT ..., GROUP BY a.ID), но я не продвигаюсь. Честно говоря, я все еще пытаюсь склонить голову к объединению.

Может ли кто-нибудь посоветовать?

+1

Это 'b.ID =«210'' есть предикат, который ограничивает соответствие записей из 'Lists' таблицы. –

+0

Да, я думаю, вы хотели отфильтровать идентификатор в 'a' not' b'. – shawnt00

ответ

0

проблема состоит в том, что recip поле содержит число с в списке '22,33,40,42,45'. Если эта строка соответствует номеру в a.USER_ID = b.RECIP, тогда строка будет оцениваться как номер 22, потому что запятая не является частью допустимого числа в mysql, поэтому mysql перестает оценивать строку при первом появлении запятой.

Лучшим решением будет нормализация структуры данных и сохранение каждого значения в пределах recip в его собственной записи.

Быстрое решение заключается в использовании find_in_set() функцию в выражении присоединиться:

SELECT a.`USER_ID` 
FROM Users a 
INNER JOIN Lists b ON find_in_set(a.`USER_ID`,b.`RECIP`)>0 
WHERE a.`PARENT` = '1' 
AND b.`LIST_ID` = '210' 
+0

Отлично, спасибо. Прекрасно работает с меньшими значениями «RECIP», но мне нужно разработать более эффективное решение, так как некоторые списки RECIP содержат более 10 000 идентификаторов в настоящий момент. – ArtMan

+0

Как сказано, лучшим решением будет нормализация структуры данных. Я предполагаю, что вы следовали за быстрым решением. – Shadow

+0

Временно да. Но я обещаю, что нормализую структуру данных для долгосрочных выгод! :) – ArtMan

0

Вы фильтрацию только одна строка в таблице второй из-за этого:

AND b.`ID` = '210' 

Одно из следующих должно работать, в зависимости от ваших данных, которые вы ничего не показывают:

SELECT a.`ID` 
FROM Users a 
INNER JOIN Lists b ON a.`ID` = b.`RECIP` 
WHERE a.`PARENT` = '1' 

или

SELECT a.`ID` 
FROM Users a 
LEFT JOIN Lists b ON a.`ID` = b.`RECIP` 
WHERE a.`PARENT` = '1' 
Смежные вопросы