当GroupMembership表中没有条目时,我想要的是Users.id和Groups.id与GroupMembership.id的每种可能组合。当有...时不为空。
例如,说有3个组,3个用户。用户1在组1中,用户2在组1和组中。 2,用户3没有组,组3没有用户。我正在寻找一个看起来有点像这样的列表:
--> user1
U.id = 1
G.id = 1
Gm.id = 1
U.id = 1
G.id = 2
Gm.id = (null - I.e there isn't an entry in the table that intersects this U.id & G.id combo)
U.id = 1
G.id = 3
Gm.id = (null - I.e there isn't an entry in the table that intersects this U.id & G.id combo)
--> user2
U.id = 2
G.id = 1
Gm.id = 2
U.id = 2
G.id = 2
Gm.id = 3
U.id = 2
G.id = 3
Gm.id = (null - I.e there isn't an entry in the table that intersects this U.id & G.id combo)
--> user3
U.id = 3
G.id = 1
Gm.id = (null - I.e there isn't an entry in the table that intersects this U.id & G.id combo)
U.id = 3
G.id = 2
Gm.id = (null - I.e there isn't an entry in the table that intersects this U.id & G.id combo)
U.id = 3
G.id = 3
Gm.id = (null - I.e there isn't an entry in the table that intersects this U.id & G.id combo)
我可以获得所有这些用户和可能的gms:
SELECT t1.id, t2.idGroupMembership
FROM auth.users t1
LEFT JOIN AcmeCo.GroupMembership t2 ON t1.id = t2.idUser
WHERE t1.staff = 1
ORDER BY id, idGroup
但是,如果我试图将群组滑入等式......:
SELECT t1.email, t2.idGroupMembership, t3.idGroup
FROM auth.users t1
LEFT JOIN AcmeCo.GroupMembership t2 ON t1.id = t2.idUser
LEFT JOIN AcmeCo.Groups t3 ON t3.idGroup = t2.idGroup
WHERE t1.staff = 1
...我没有收到全套小组 - 它没有显示不相交的记录。希望这是有道理的。
由于
答案 0 :(得分:1)
您可以使用CROSS JOIN。这对我使用sqlite和你的测试数据很有用。
SELECT U.id, G.id, Gm.id
FROM Users U CROSS JOIN Groups G
LEFT JOIN GroupMembership Gm
ON U.id = Gm.idUser AND G.id = Gm.idGroup;
结果:
1|1|1
1|2|
1|3|
2|1|2
2|2|3
2|3|
3|1|
3|2|
3|3|
答案 1 :(得分:0)
要获得两个表之间的所有可能组合,您不应该LEFT JOIN它们。这个查询可以解决这个问题:
SELECT t1.email, t2.idGroup
FROM auth.users AS t1, AcmeCo.Groups t2
现在,要选择组成员身份ID,请执行以下操作:
SELECT t1.email, t2.idGroup,
(SELECT idGroupMembership FROM AcmeCo.GroupMembership WHERE idUser=t1.id AND idGroup=t2.idGroup) AS idGroupMembership
FROM auth.users AS t1, AcmeCo.Groups t2
ORDER BY t1.id, t2.idGroup