我的网站上有会员搜索功能。 它基本上做的是从leden表中获取一些信息,并为找到的每个成员显示它,除了你自己。
$ id是登录的人。
现在,这是我当前的查询:
$sql = "
SELECT ldn.schermnaam, ldn.geboortedatum, ldn.userid, ldn.foto, ldn.oproep
FROM leden AS ldn
WHERE ldn.userid != $id
";
这很好用。
现在我想要的是排除被你阻止的成员。 blockedmembers表如下所示:
- ID
- Useridsender (the one that blocked the other one)
- Useridreceiver (the one that has been blocked)
- Creation date
现在我想排除被阻止的成员,不要在结果列表中显示它们。
我尝试使用INNER JOIN和LEFT JOIN,但还没弄明白如何获得一个好的查询。 任何人都知道我的查询应该是什么样的?
P.S。它是一个动态查询,所以基于用户输入AND语句最后添加。
答案 0 :(得分:6)
$sql = "
SELECT ldn.schermnaam, ldn.geboortedatum, ldn.userid, ldn.foto, ldn.oproep
FROM leden AS ldn
WHERE ldn.userid != $id AND ldn.userid NOT IN(SELECT Useridreceiver FROM blocktable WHERE Useridsender=$id)
";
这应该非常接近我正在使用子选择,但它也可以使用外部连接来完成我认为
答案 1 :(得分:3)
很多人都在回答,使用子选择。这是我的LEFT JOIN(没有subselect)
您可以使用LEFT JOIN选择匹配,然后提取不匹配的条目(连接表ID为空)
SELECT ldn.schermnaam, ldn.geboortedatum, ldn.userid, ldn.foto, ldn.oproep
FROM leden AS ldn LEFT JOIN blockedmembers AS blm
ON (blm.Useridsender=$id AND ldn.userid=blm.Useridreceiver)
WHERE ldn.userid != $id
AND blm.ID IS NULL
答案 2 :(得分:1)
过滤blockedmembers
表的结果
$sql="SELECT ldn.schermnaam, ldn.geboortedatum, ldn.userid, ldn.foto, ldn.oproep
FROM leden AS ldn
WHERE ldn.userid != $id AND ldn.userid NOT IN
(SELECT Useridreceiver FROM blockedmembers WHERE Useridsender =$id)";
答案 3 :(得分:1)
您使用NOT IN
获得了有效的答案,但是没有人建议使用NOT EXISTS
,这对您来说可能是更好的选择。
看看这里:NOT IN vs NOT EXISTS
SELECT
ldn.schermnaam, ldn.geboortedatum, ldn.userid, ldn.foto, ldn.oproep
FROM
leden AS ldn
WHERE
ldn.userid != $id
AND
NOT EXISTS (
SELECT 1
FROM blockedmembers AS bm
WHERE
bm.Useridreceiver = ldn.userid
AND
bm.Useridsender = $id
)