我有三张桌子
ZoneTable
ID, Name
UserTable
ID, Name
UserZone
ZoneTableID, UserTableID
现在。
SELECT ID, Name from ZoneTable
给出了完整的区域列表。
如果我执行以下操作
SELECT ZoneTable.ID, ZoneTable.Name from ZoneTable LEFT JOIN UserZone on UserZone.ZoneTableID = ZoneTable.ID WHERE UserTableID = :ID GROUP BY ZoneTable.ID
为我提供了允许用户使用的区域列表。
现在,如果允许所有区域中的用户使用,那么它们就会令人烦恼,那么它们根本不会出现在UserZone中。
无论如何,我可以获得每个特定用户用户的ZoneTableID列表,如果计数为0,那么不要应用where子句,如果count> 0然后只在一个查询中显示特定的区域名称。
如果这是有道理的
由于
答案 0 :(得分:1)
注意:您不需要使用外部联接,并且可以将查询重写为:
SELECT ID, Name
FROM ZoneTable
WHERE ID IN (SELECT ZoneTableID
FROM UserZone
WHERE UserTableID = :ID);
无论如何,您可以将条件添加到WHERE子句中:
SELECT ID, Name
FROM ZoneTable
WHERE ID IN (SELECT ZoneTableID
FROM UserZone
WHERE UserTableID = :ID)
OR NOT EXISTS (SELECT ZoneTableID
FROM UserZone
WHERE UserTableID = :ID);
或为第二种情况添加第二个查询:
SELECT ID, Name
FROM ZoneTable
WHERE ID IN (SELECT ZoneTableID
FROM UserZone
WHERE UserTableID = :ID)
UNION ALL
SELECT ID, Name
FROM ZoneTable
WHERE NOT EXISTS (SELECT ZoneTableID
FROM UserZone
WHERE UserTableID = :ID);
答案 1 :(得分:0)
您是否考虑过NOT IN子查询?如:in ... OR:ID NOT IN(从userzone选择usertableid,其中usertableid =:ID)