PHP / MySQL查询排除结果

时间:2013-06-26 11:31:47

标签: php mysql sql

我的网站上有会员搜索功能。 它基本上做的是从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语句最后添加。

4 个答案:

答案 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
  )