[英]Mysql - select rows which have linked values
抱歉標題不好,不知道怎么用一句話形容。
有表:
id, user_id, task_id
我需要選擇具有多個 task_id 類型偽代碼的記錄的 user_ids
Select user_id from tasks wherehas task_id = 1 and task_id = 2
正如他們所說,有很多方法可以給貓剝皮。 這是一個:
要獲取分配了多個任務的用戶列表,並且(至少)他們有 task_id 1 和 task_id 2:
SELECT
user_id
FROM user_tasks // or whatever your table is called
WHERE task_id in (1, 2)
GROUP BY user_id
HAVING COUNT(DISTINCT task_id) = 2
讓我們獲取任務為 1 或 2 的所有行,按用戶對它們進行分組,並僅顯示最小任務 ID 與最大任務 ID 不同的用戶:
SELECT
user_id
FROM t
WHERE task_id in (1, 2)
GROUP BY user_id
HAVING MIN(task_id) <> MAX(task_id)
您需要了解所有這些,當您編寫 WHERE 子句時,它對每一行都被評估為真。 這意味着您不能說WHERE x = 1 AND x = 2
因為 X 的值永遠不會在同一行同時為 1 和 2。
相反,我們使用 OR 來獲取所有為 1 或 2 的用戶行,這會給我們一個混合 - 有些用戶有多個行(第一行是 1,下一行是 2)。 其他用戶只有一行 - 一或二。
User Task
John 1
Jane 1
Jane 1
Jake 1
Jake 2
Joel 2
當我們應用分組操作時,所有這些行都被壓縮為每個用戶一行,然后可以使用 MIN 和 MAX 之類的東西並有意義。 對於只有一行的用戶,他的 MIN 和 MAX 將是相同的數字。 對於有 20 行值都為 1 的用戶,它們的 MIN 和 MAX 也相同。 只有至少有一行是 1 和另一行是 2 的用戶才會有不同的最小值和最大值:
User MIN MAX
John 1 1
Jane 1 1
Jake 1 2 <-- the only user HAVING MIN <> MAX
Joel 2 2
Min 和 max 僅在您正在尋找 2 個不同值的情況下才真正有用。 在其他情況下,您可能會查找包含與 IN 列表中的元素相同的數字的 COUNT DISTINCT
我想你的意思是你想要 user_id 的值,其中有一個 task_id 1 的任務和 task_id 2 的任務。
您的解決方案不起作用,因為它正在尋找具有 task_id 1 和 task_id 2 的任務(這是不可能的)
你需要:
select a.user_id from tasks a where a.task_id = 1 inner join
tasks b where b.user_id = a.user_id and b.task_id = 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.