MYSQL - Left Join при нескольких условиях - Медиа, теги и ссылки тегов - PullRequest
0 голосов
/ 07 марта 2020

Я не могу найти ничего, что соответствует моим проблемам.

Я пытаюсь улучшить свой поисковый запрос файлов, чтобы можно было получать изображения по нескольким тегам (И и ИЛИ).

Получить изображения, имеющие один или другой тег, довольно просто:

SELECT M.*, MTL.tag_id 
FROM medias M 
LEFT JOIN medias_taglinks MTL ON MTL.media_id=M.id 
WHERE ( MTL.tag_id = '1' || MTL.tag_id = '2') 
GROUP BY M.id

Но если я хочу получить изображение с обоими тегами, я не получаю результатов и не понимаю, почему .

SELECT M.*, MTL.tag_id 
FROM medias M 
LEFT JOIN medias_taglinks MTL ON MTL.media_id=M.id 
WHERE ( MTL.tag_id = '1' && MTL.tag_id = '2') 
GROUP BY M.id

Полагаю, мне нужно добавить свое условие в объединение, но мне это еще не удалось.

SQL ЗДЕСЬ: http://sqlfiddle.com/#! 9 / 6e5d6 / 4

1 Ответ

1 голос
/ 07 марта 2020

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

select m.id, m.name
from medias m
inner join medias_taglinks t on t.media_id = m.id
where t.tag_id in (1, 2)
group by m.id, m.name
having min(t.tag_id) <> max(t.tag_id)

Фильтр запросов по двум поисковым тегам, агрегирует по медиа и обеспечивает что оба тега присутствуют.

В вашей скрипте базы данных это выдает:

id | name
-- | ----
1  | Media 1

Если вы хотите обработать более двух тегов, вот более общий подход c:

select m.id, m.name
from medias m
inner join medias_taglinks t on t.media_id = m.id
where t.tag_id in (1, 2, 3, 4)
group by m.id, m.name
having count(*) = 4

Предполагается, что в таблице тегов не будет дубликата (media_id, tag_id); в противном случае вам нужно having count(distinct t.tag_id) = 4.

Примечание: left join кажется ненужным; если вы хотите искать в тегах носители, вам все равно нужно привести таблицу вкладок.

...