Как я могу объединить несколько полиморфных таблиц, не вытягивая пустые записи? - PullRequest
1 голос
/ 01 марта 2011

У меня есть много таблиц, которые представляют группы, в которых можно «участвовать» (скажем, «Клубы», «Общества» и «Классы»), и таблица, представляющая все «участия» (участия).Поэтому я могу узнать, в каких классах участвует пользователь:

SELECT * FROM Participations WHERE user_id = 1 and Participations.group_type = "Class";

Я также могу узнать, какие пользователи находятся в клубе с идентификатором 12, выполнив что-то вроде этого:

SELECT * FROM Users INNER JOIN Participations ON (Users.id = Participations.user_id) WHERE Participations.group_type = "Club" and Participations.group_id = 12;

Я ХОЧУ найти всех пользователей, которые находятся в Club 12, Club 20 или Class 10, не возвращая пользователей, которые не участвуют ни в одной из этих групп.

SELECT * FROM Users INNER JOIN Participations ON (Users.id = Participations.user_id) WHERE (Participations.group_type = "Club" AND Participations.group_id IS IN (12,20)) OR (Participations.group_type = "Class" AND Participations.group_id IS 10)

И более того, я хочу отобразить название группы, в которой они участвовали, опять же без учета пользователей, которые не участвуют ни в одной из этих групп (что-то вроде этого):

SELECT Users.*, Classes.name, Clubs.name, FROM Users, Classes, Clubs, Participations (Users.id = Participations.user_id) WHERE Users.id = Participations.user_id AND ((Participations.group_type = "Club" AND Participations.group_id IS IN (12,20)) OR (Participations.group_type = "Class" AND Participations.group_id IS 10))

Но я бы предпочелиспользовать явные соединения.Это выполнимо?

1 Ответ

2 голосов
/ 06 марта 2011

Вы можете просто добавить необходимые условия в предложение join:

SELECT * FROM Users 
 INNER JOIN Participations 
    ON (Users.id = Participations.user_id) 
   AND ( (Participations.group_type = "Club" AND Participations.group_id IS IN (12,20)) 
      OR (Participations.group_type = "Class" AND Participations.group_id IS 10) )
...