Если я правильно понимаю, что вам нужны туры, которые имеют обе темы (с theme_id = 36 и 45) и оба тега (с tag_id = 10 и 15), тогда вам не нужны ни GROUP BY
, ни DISTINCT
.
Но один из способов сделать это - присоединиться дважды к каждой из вторичных таблиц:
SELECT op.id
FROM optional AS op
JOIN optional_theme_rel AS theme1
ON theme1.tour_id = op.id
AND theme1.theme_id = 36
JOIN optional_theme_rel AS theme2
ON theme2.tour_id = op.id
AND theme2.theme_id = 45
JOIN optional_tag_rel AS tag1
ON tag1.tour_id = op.id
AND tag1.tag_id = 10
JOIN optional_tag_rel AS tag2
ON tag2.tour_id = op.id
AND tag2.tag_id = 15
Другой способ получить те же результаты:
SELECT op.id
FROM optional AS op
JOIN
( SELECT tour_id
FROM optional_theme_rel
WHERE theme_id IN (36, 45)
GROUP BY tour_id
HAVING COUNT(DISTINCT theme_id) = 2
) AS theme
ON theme.tour_id = op.id
JOIN
( SELECT tour_id
FROM optional_tag_rel
WHERE tag_id IN (10, 15)
GROUP BY tour_id
HAVING COUNT(DISTINCT tag_id) = 2
) AS tag
ON tag.tour_id = op.id