【发布时间】:2016-09-13 19:05:33
【问题描述】:
以下查询将返回所有“阻止者”用户和所有“被阻止”用户。相当直接的查询。
$stmt=$db->prepare('SELECT blocker,blocked FROM list_blocked
WHERE (blocked = :username AND blocker <> :username)
OR (blocker = :username AND blocked <> :username)');
$stmt->bindParam(':username', $username);
$stmt->execute();
下一个查询将返回 members 表中除当前 $username 之外的所有用户名。
$query = $db->prepare("SELECT username FROM members WHERE username <> :username");
$query->bindValue(':user', $username;
$query->execute();
$row = $query->fetchAll();
我需要的是一种从第一个查询的结果中获取所有值的方法,不包括活动的 $username,然后从第二个查询中排除所有这些结果。
例如:
Example results of first query:
jim blocked joe
larry blocked joe
steve blocked joe
joe blocked tony
jack blocked joe
Those results applied to the second query would look something like:
$query = $db->prepare("SELECT username FROM members WHERE username <> :username
AND username <> jim
AND username <> larry
AND username <> steve
AND username <> tony
AND username <> jack");
我将如何实现这样的目标?
更新:
所以我尝试使用子查询,但它一直返回“操作数应包含 1 列”
SELECT username FROM members WHERE username NOT IN (
SELECT blocker,blocked FROM list_blocked
WHERE (blocked = 'viraladmin' AND blocker <> 'viraladmin')
OR (blocker = 'viraladmin' AND blocked <> 'viraladmin')
)
另一个更新:
我尝试使用内部连接来实现这一点,但是结果总是返回空,我认为这是因为实际上没有什么可以加入。
SELECT members.username, list_blocked.blocker, list_blocked.blocked
FROM members
INNER JOIN list_blocked
ON members.username = list_blocked.blocker
AND members.username = list_blocked.blocked
WHERE members.username <> 'username'
AND (list_blocked.blocked = 'username' AND list_blocked.blocker <> 'username')
OR (list_blocked.blocker = 'username' AND list_blocked.blocked <> 'username')
【问题讨论】:
-
为什么不使用子查询之类的东西来确定不选择什么?
-
@Blake 答案是,因为我不知道该怎么做,这也许是我希望学习的。 :)
-
当然,如果有人向你扔了一块谷歌骨头,你也可以做到。
-
在
WHERE子句中混合使用AND和OR时,需要非常小心地使用括号,因为AND的优先级高于OR。