[英]php PDO MySQL Select results of one table based on array of results from another table
以下查詢將返回所有“阻止者”用戶和所有“阻止”用戶。 相當直接的查詢。
$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();
下一個查詢將返回成員表中除當前$ 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')
您可以使用子查詢來完成此操作:
SELECT username FROM members WHERE username NOT IN (
SELECT blocker,blocked FROM list_blocked
WHERE (blocked = :username AND blocker <> :username)
OR (blocker = :username AND blocked <> :username)
)
已編輯-為了適合SQL查詢,您需要在子查詢中進行合並,以便返回的結果不超過一欄。 :
SELECT username FROM members WHERE username NOT IN (
SELECT blocker as username FROM list_blocked
WHERE (blocked = :username AND blocker <> :username)
OR (blocker = :username AND blocked <> :username)
UNION
SELECT blocked as username FROM list_blocked
WHERE (blocked = :username AND blocker <> :username)
OR (blocker = :username AND blocked <> :username)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.