2012-10-23 58 views
0

我需要選擇存在於用戶表中但不存在於表中的記錄groups_members,groups_member_unapprovedgroups_invitationsMysql - 無法選擇表A中存在且不存在於表B,C,D中的記錄

$ _ POST [「MSG_ID」]包含多個用戶ID,我不知道如何使用破滅聲明3子查詢,所以我代替它??? - 問號。

謝謝。

$result = mysql_query("SELECT id FROM users 
WHERE id IN (". implode(', ', $_POST['msg_id']).") 
AND id NOT IN (SELECT memberid FROM groups_members where memberid='???' and groupid='$cid') 
AND id NOT IN (SELECT memberid FROM groups_members_unapproved where memberid='???' and groupid='$cid') 
AND id NOT IN (SELECT invited FROM groups_invitations where invited = '???' and groupid='$cid')",$gb1) or die('Error'); 

回答

0

什麼你很可能希望做的是一個LEFT OUTER這裏JOIN這樣

SELECT id FROM users AS u 
LEFT OUTER JOIN groups_members AS gm ON u.id = gm.memberid 
LEFT OUTER JOIN groups_members_unapproved AS gmu ON u.id = gmu.memberid 
LEFT OUTER JOIN groups_invitations AS gi ON u.id = gi.invited 
WHERE 
id IN (<your implode here>) 
AND gm.memberid IS NULL 
AND gmu.memberid IS NULL 
AND gi.invited IS NULL 
AND gm.groupid <> <your group id> 
AND gmu.groupid <> <your group id> 
AND gi.groupid <> <your group id> 

的想法是,外部連接將返回記錄在所有連接的表,即使有不匹配的ID的,但where子句中的* IS NULL行將將這些記錄限制爲僅在用戶表與任何其他表之間沒有匹配成員標識的情況下。

我不太確定groupid帶來了什麼價值的查詢。我認爲,如果你關心的是在用戶級識別記錄,那麼這將是一個不必要的字段來過濾。

這應該是一個比使用子查詢更高效的查詢,只要所有的ID字段都是索引的。當然,如果這是您希望頻繁執行的查詢,那麼您可能需要考慮更改模式以獲得更優化的查詢。

+0

你會想用'IS NULL'替換'= NULL'。 –

+0

@JoachimIsaksson是的。糾正。 –

+0

我的問題是不準確的。 「groupid」在這裏非常重要,因爲我需要選擇3個表中不存在的記錄 - groups_members,groups_members_unapproved,groups_invitations和相同的「$ groupid」。他們的查詢應該選擇記錄,即使它們存在於3個表中但具有不同的組ID。 – user1692255

1

最簡單的方法就是將???放在子查詢中,因爲它們在那裏不需要;

SELECT id FROM users WHERE id IN (...) 
AND id NOT IN 
    (SELECT memberid FROM groups_members WHERE groupid='$cid') 
AND id NOT IN 
    (SELECT memberid FROM groups_members_unapproved WHERE groupid='$cid') 
AND id NOT IN 
    (SELECT invited FROM groups_invitations WHERE groupid='$cid') 

SQLfiddle demo

相關問題