2014-11-11 4 views
0

Я пытаюсь создать запрос, который выбирает из трех таблиц.MySQL множественное внутреннее соединение, не возвращающее строки

 
m_release 
--------------------------- 
release_id  name  
--------------------------- 
    1    release1 
    2    release2 
    3    release3 


mk_release_artist 
--------------------------- 
release_id  artist_id  
--------------------------- 
    1    134 
    2    135 


mk_release_remix 
--------------------------- 
release_id  artist_id  
--------------------------- 
    3    134    

Я создал следующий запрос до сих пор, но он не возвращает ни одной строки:

SELECT * FROM m_release A 
JOIN mk_release_artist B ON A.release_id = B.release_id AND B.artist_id = 134 
JOIN mk_release_remix C ON A.release_id = C.release_id AND C.artist_id = 134

Она работает, когда я буду выбирать из двух таблиц, используя один РЕГИСТРИРУЙТЕСЬ

SELECT * FROM m_release A 
JOIN mk_release_artist B ON A.release_id = B.release_id AND B.artist_id = 134

выход я жду, чтобы увидеть это:

 
--------------------------- 
release_id  name  
--------------------------- 
    1    release1  
    3    release3 
+1

Трудно сказать, не, например, данные и ожидаемые результаты –

+0

Вы абсолютно уверены, что есть соответствующие строки in'mk_release_remix'? – jpw

+0

Кроме того, вы уверены, что знаете, что такое ** INNER ** join действительно делает? Если нет, попробуйте поменять этот последний INNER JOIN на LEFT JOIN и проверить разницу. –

ответ

0

Итак, в B, author_id является автором, в то время как в C это ремиксер. Затем в вашем запросе выбираются записи , где ОБА и автором и ремиксером являются id=134. У вас нет соответствующих записей в вашем примере.

juergen d's query будет выбирать записи, в которых либо автор, либо ремиксер - это id. Поскольку он использует LEFT JOIN s, он даже получит выпуски, которые не имеют соответствующей записи ни в B, ни в C (соответствующими столбцами будут NULL).

+0

A это таблица со всеми выпусками в моей базе данных. B, где релиз связан с художником, если художник является оригинальным композитором. C связан с художником, если художник является ремиксером. Запрос состоит в том, чтобы выбрать все релизы, которые связаны с художником – Franknsnoff

0
SELECT A.* 
FROM m_release A 
LEFT JOIN mk_release_artist B ON A.release_id = B.release_id 
LEFT JOIN mk_release_remix C ON A.release_id = C.release_id 
WHERE 134 in (B.artist_id, C.artist_id) 
+0

'-1', чтобы не объяснить, почему использовать' LEFT JOIN' вместо 'INNER JOIN', а также почему переместить условие' artist_id' в другое место. – Vyktor

Смежные вопросы