0

我的网站上有会员搜索功能。它的基本作用是从 leden 表中获取一些信息,并为找到的每个成员显示它,除了你自己。

$id 是登录的人。

现在,这是我当前的查询:

$sql = "
SELECT ldn.schermnaam, ldn.geboortedatum, ldn.userid, ldn.foto, ldn.oproep
FROM leden AS ldn
WHERE ldn.userid != $id
";

这工作正常。

现在我想要的也是排除被你阻止的成员。被阻止的成员表如下所示:

- ID
- Useridsender (the one that blocked the other one)
- Useridreceiver (the one that has been blocked)
- Creation date

现在我想排除被阻止的成员并且不在结果列表中显示它们。

我尝试使用 INNER JOIN 和 LEFT JOIN,但还没有弄清楚如何获得好的查询。任何人都知道我的查询应该是什么样子?

ps 它是一个动态查询,所以根据用户输入在末尾添加 AND 语句。

4

4 回答 4

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)
";

这应该非常接近我正在使用子选择,但我认为也可以使用外部连接来完成

于 2013-06-26T11:36:25.717 回答
3

很多人都在回答,使用子选择。这是我的使用 LEFT JOIN(没有子选择)

您可以使用 LEFT JOIN 选择匹配项,然后提取没有匹配项的条目(连接表 id 为 NULL)

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
于 2013-06-26T11:45:57.783 回答
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)";
于 2013-06-26T11:38:55.833 回答
1

NOT IN但是没有人建议您使用有效的答案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
  )
于 2013-06-26T11:46:30.180 回答