У меня есть много таблиц, которые представляют группы, в которых можно «участвовать» (скажем, «Клубы», «Общества» и «Классы»), и таблица, представляющая все «участия» (участия).Поэтому я могу узнать, в каких классах участвует пользователь:
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))
Но я бы предпочелиспользовать явные соединения.Это выполнимо?