簡體   English   中英

如何選擇不同的行並交叉檢查另一個表?

[英]How do I select distinct rows and cross check in another table?

我有3個表, userstasks以及completed_tasks 因此,基本上我想選擇user_id = 2所有任務,並檢查該任務在另一個表中是否不存在。所以這是我的表:

users表:

+----+-------+
| id | name  |
+----+-------+
|  1 | John  |
|  2 | Sally |
+----+-------+

tasks表:

+----+-----------+---------+
| id | task_name | user_id |
+----+-----------+---------+
|  1 | mop floor |       2 |
|  2 | dishes    |       1 |
|  3 | laundry   |       2 |
|  4 | cook      |       2 |
+----+-----------+---------+

completed_tasks表:

+----+---------+---------+
| id | task_id | user_id |
+----+---------+---------+
|  1 |       1 |       2 |
+----+---------+---------+

這是我當前用於MySQL數據庫的SELECT代碼:

$db = "SELECT DISTINCT tasks.task_name, users.name FROM tasks LEFT JOIN ON users.id = tasks.user_id WHERE tasks.user_id = 2";

我遇到的問題是:我希望它在completed_tasks表中搜索,如果該任務存在,則不要選擇該任務。

我嘗試通過添加以下內容來做到這一點,但是它沒有用:

LEFT JOIN completed_tasks ON completed_tasks.user_id = 2

那是行不通的,因為如果我有多個已完成的任務,它將一並忽略。

我希望最終結果應返回任務3和4的用戶名和任務名。

另外,性能我的應用程序至關重要 我可以使用PHP並遍歷數組並對每個數組進行SELECT ,但這對性能不利。

您有幾種方法可以做到這一點。

您可以使用LEFT JOIN ,然后在可選表中檢查NULL

SELECT a.name, b.task_name
FROM users a
JOIN tasks b ON a.id = b.user_id
LEFT JOIN completed_tasks c ON c.task_id = b.id AND c.user_id = b.user_id
WHERE c.id IS NULL
;

您可以執行NOT EXISTS子查詢

SELECT a.name, b.task_name
FROM users a
JOIN tasks b ON a.id = b.user_id
WHERE NOT EXISTS (
    SELECT 1
    FROM completed_tasks c
    WHERE c.task_id = b.id AND c.user_id = b.user_id)
;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM