[英]MySQL query to get all items that do not belong to another table
我有一個問題,有幾個小時無法解決。
我有3張桌子:
Process
\n + ---- + ---------- + ---------------- + -------- + ------- ------ + --------------- + ------------- + --------- + --- --- +\n | id | 名稱| 描述| 活躍 負責任| notifyByEmail | notifyBySms | 備注| 圖標|\n + ---- + ---------- + ---------------- + -------- + ------- ------ + --------------- + ------------- + --------- + --- --- +\n | 4 | 流程1 | TestDecriptino | 1 | 0 | 0 | 0 | 0 | NULL |\n | 5 | Process2 | 測試 0 | 0 | 0 | 0 | 測試 NULL |\n | 6 | Process3 | 12322 | 1 | 0 | 0 | 0 | 12322 | NULL |\n | 7 | Process4 | 222222222222 | 0 | 0 | 0 | 0 | 2222222 | NULL |\n | 9 | Process5 | sgdasad | 1 | 0 | 1 | 0 | dhds | NULL |\n + ---- + ---------- + ---------------- + -------- + ------- ------ + --------------- + ------------- + --------- + --- --- +\n
Systems
\n + ---- + --------- + ------------- + -------- + ----------- -------- + -------- + ------------- + --------- + - ----- +\n | id | 名稱| 描述| 活躍 liabilityUserId | notifyByEmail | notifyBySms | 備注| 圖標|\n + ---- + --------- + ------------- + -------- + ----------- -------- + -------- + ------------- + --------- + - ----- +\n | 2 | Sistem1 | fdjgf | 1 | 1 | 1 | 1 | 0 | NULL |\n | 6 | Sistem2 | koam | 0 | 3 | 1 | 0 | SADGS | NULL |\n + ---- + --------- + ------------- + -------- + ----------- -------- + -------- + ------------- + --------- + - ----- +\n
Process_Systems
\n + ---- + ----------- + ---------- + -------- + --------- +\n | id | processId | systemId | 活躍 備注|\n + ---- + ----------- + ---------- + -------- + --------- +\n | 4 | 4 | 2 | 1 | aa |\n | 8 | 7 | 2 | 1 | aa |\n | 11 | 9 | 2 | 1 | aa |\n | 15 | 4 | 6 | 0 | aa |\n + ---- + ----------- + ---------- + -------- + --------- +\n
我有哪些方法processID
是一個參數,並且必須以某種方式過濾所有Process_Systems
由ID,然后讓Systems
不屬於Process_Systems
表。
一種方法是使用NOT IN
子查詢 :
SELECT * FROM Systems WHERE id NOT IN ( SELECT systemid FROM Process_Systems WHERE processId = ? );
另一種方法是使用NOT EXISTS
子查詢 :
SELECT * FROM Systems WHERE NOT EXISTS ( SELECT * FROM Process_Systems WHERE systemId = Systems.id AND processId = ? );
第三種方法是使用外部聯接 :
SELECT Systems.* FROM Systems LEFT JOIN Process_Systems ps ON ps.systemId = Systems.id AND ps.processId = ? WHERE ps.systemId IS NULL;
在sqlfiddle上看到它們。
有關各自性能差異的分析,請參見@Quassnoi的博客文章:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.