2013-06-26 179 views
0

我在我的网站上有一个成员搜索功能。 它的基本功能是从学习表中获取一些信息,并为每个找到的成员显示它,除了你自己。排除结果的PHP/MySQL查询

的$ 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语句添加到最后。

回答

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

这应该是相当接近我使用一个子选择,但它也可以使用外部完成加入我觉得从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)"; 
+0

我认为这是一个很好的解决方案。 – casraf

+1

我想任何连接都可以使用,或者至少与INNER JOIN不同,如果表默认为空 –

+0

既然你是第一个......我会感谢你! 很好,谢谢:D 不能upvote你呢。 另外,感谢其余! – Nick

1

筛选结果的人在回答,使用子选择。这里是我使用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 
+0

烨有点晚:( –

+0

原始代码,而无需任何解释相关? –

+0

@RoyalBg现在添加的目的 –

3

很多

+0

+1以来提供基于加入版本我懒得自己做:) – Dave

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 
)