我有两张桌子
用户:
id,
username
和
app:
userid,
appid,
mainid
我想显示此表中没有记录的用户。我来自地址mainId
和appid
。如果我运行此查询
SelectQuery("select User.UserName
from User
INNER JOIN App
ON User.Id = App.UserId
where App.Mainid!= ".$var_MainId." and App.AppId<>".$var_AppId);
它不会显示可能具有相同userid
和mainid
但不相同appid
的用户
答案 0 :(得分:2)
您可以使用not exists
子句。例如,要查找没有使用MainId 123和AppId 456的应用程序条目的用户:
select u.UserName
from User u
where not exists
(
select *
from App a
where a.UserId = u.Id
and a.MainId = 123
and a.AppId = 456
)
答案 1 :(得分:1)
我建议使用反连接模式。但规范不是很清楚。 (样本数据和预期产出将大大有助于澄清它。)
SELECT u.id
, u.username
FROM user u
LEFT
JOIN app a
ON a.userid = u.id
AND a.mainid <=> ?
AND a.appid <=> ?
WHERE a.userid IS NULL
此查询将返回u
中的行,其中a
中没有匹配的行,其中包含mainid和appid的指定值。
将user
表的内容指定为
id username
---- --------
2 foo
3 fee
5 fi
和app
表格为
userid appid mainid
------ ----- ------
2 444 888
3 444 1
3 1 888
如果我们在查询中为appid
指定了444,为mainid
指定了888,例如
SELECT u.id
, u.username
FROM user u
LEFT
JOIN app a
ON a.userid = u.id
AND a.mainid <=> 444
AND a.appid <=> 888
WHERE a.userid IS NULL
此查询将返回用户3和5.(不会返回用户2,因为app
中有一行符合规范。)
还有其他查询模式将返回等效结果。使用NOT EXISTS (correlated subquery)
模式可能是最容易理解的模式。