оставьте присоединиться с конкретными условиями, помогите пожалуйста - PullRequest
1 голос
/ 21 ноября 2011

У меня проблема с построением запроса здесь упрощенная структура таблиц 3 стола

Event [Event_id , Event_name]

Event_files [Event_id(FK) , File_id(FK)]

Uploaded_Files[File_id , File_type, File_path]

у нас в основном 2 типа файлов

  • image = 2

  • документ = 4

я пытаюсь собрать события вместе с их изображениями (если у них есть изображение) я пытаюсь сделать это с помощью этого запроса

select e.id, e.name,uf.id as file_id,uf.path  
from event e
left join event_file ef on ef.event_id = e.id
left join uploaded_file uf ON ef.file_id = uf.id

я знаю, что мне нужно применить условие, но каждый раз, когда я делаю в где или ВКЛ, всегда есть проблема с запросом например, если я подам заявление:

left join uploaded_file uf ON ef.file_id = uf.id AND (uf.type = 2 )

он по-прежнему будет возвращать 2 записи для событий, которые имеют изображение, и подать одну из них с file_path null.

с другой стороны, если я сделаю следующее:

where (uf.id is null OR (uf.id is not null AND uf.type=2))

события, содержащие только файлы и изображения, больше не возвращаются

есть решение, пожалуйста?

заранее спасибо

1 Ответ

3 голосов
/ 21 ноября 2011
SELECT e.id, e.name, f.file_id AS file_id, f.path
FROM event e
LEFT JOIN
(
    SELECT ef.event_id, uf.id AS file_id, uf.path
    FROM event_file ef
    INNER JOIN uploaded_file uf ON ef.file_id = uf.id AND uf.type = 2
) f ON f.event_id = e.id

Это должно сработать (не проверено). Причина, по которой вы получаете пустую запись, заключается в том, что вы указываете только условие uf.type в таблице uploaded_file, которая ничего не накладывает на левое соединение для файла события.

...