поиск записей с объединением в нескольких таблицах отношений - PullRequest
0 голосов
/ 29 июня 2011

у меня 3 таблицы.

  1. Таблица тура (необязательно)
  2. Таблица отношения тега тура (необязательный_tag_rel)
  3. Таблица отношения темы тура (необязательно_theme_rel)

AТур может иметь несколько тегов и несколько тем.Так что я, что написать и SQL заявление, чтобы найти указанные туры.Например, найдите туры, где тэг id = 10 и 15 и id темы = 36 и 45.

SELECT DISTINCT (t1.id) FROM optional AS t1 
LEFT JOIN optional_theme_rel as t3 ON t3.tour_id = t1.id AND (t3.theme_id =36 OR t3.theme_id =45)
LEFT JOIN optional_tag_rel as t2 ON t2.tour_id = t1.id AND (t2.tag_id = 10 OR t2.tag_id =15) 
GROUP BY optional.id 

Этот оператор получает все записи, чей идентификатор темы = 36 или 45, но мне нужно использовать оператор AND, но когдаЯ использую AND вместо OR, это не показывает запись.Должен быть другой способ сделать это на SQL, но я не знаю много об этом.

Ответы [ 2 ]

0 голосов
/ 29 июня 2011

Если я правильно понимаю, что вам нужны туры, которые имеют обе темы (с 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
0 голосов
/ 29 июня 2011
  • Использовать синтаксис IN
  • нет необходимости в group by (у вас нет агрегатных функций в игре)
  • размещение вашего AS немного вышло

Попробуйте это:

SELECT DISTINCT t1.id
FROM optional t1
LEFT JOIN optional_theme_rel as t3 ON t3.tour_id = t1.id AND t3.theme_id in (36, 5)
LEFT JOIN optional_tag_rel as t2 ON t2.tour_id = t1.id AND t2.tag_id in (10, 15) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...