簡體   English   中英

Mysql - 選擇具有鏈接值的行

[英]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.

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