簡體   English   中英

MySQL select 只有唯一值

[英]MySQL select only unique values

我有兩張桌子。

客戶:

+--------------+-------------+
|   CLIENT_ID  |    LABEL    |
+--------------+-------------+
|          123 |      label1 |
+--------------+-------------+
|          123 |      label3 |
+--------------+-------------+
|          456 |      label1 |
+--------------+-------------+
|          789 |      label2 |
+--------------+-------------+
|          987 |      label2 |
+--------------+-------------+
|          987 |      label4 |
+--------------+-------------+

經理:

+----+--------------+
| ID |   CLIENT_ID  |
+----+--------------+
|  1 |          123 |
+----+--------------+
|  1 |          456 |
+----+--------------+
|  2 |          456 |
+----+--------------+
|  3 |          789 |
+----+--------------+
|  3 |          987 |
+----+--------------+
|  4 |          789 |
+----+--------------+

我需要來自經理的 select ID,這些經理只有帶有標簽“label1”或“label2”的客戶,而沒有帶有其他標簽的客戶。 生成的 output 應該類似於 2 和 4。

我試着做

select m.id
from managers m
    join clients c on m.client_id = c.client_id
where c.label in ('label1', 'label2');

但它返回所有ID。

關。 只需添加聚合:

select m.id
from managers s join
     clients c
     on m.client_id = c.client_id
where c.label in ('label1', 'label2')
group by m.id
having count(distinct c.label) = 2;

如果您想要具有這兩個標簽的客戶端,請使用:

select m.id
from managers s join
     clients c
     on m.client_id = c.client_id
group by m.id
having count(distinct c.label) = 2;

select m.id
from managers s join
     clients c
     on m.client_id = c.client_id
group by m.id
having count(distinct case when c.label in ('label1', 'label2') then c.label end) = 2 and
       count(distinct c.label) = 2;

或者,更有效地:

having sum(c.label = 'label1') > 0 and
       sum(c.label = 'label2') > 0 and
       sum(c.label not in ('label1', 'label2')) = 0;

使用group by如下:

select m.id
from managers m
    join clients c on m.client_id = c.client_id
where c.label in ('label1', 'label2')
group by m.id
having count(*) = 1;

請嘗試group byhaving此處聲明以獲取唯一記錄

 SELECT ID FROM `Clients` c 
  left join Managers m on (c.client_id = m.CLIENT_ID) 
  where LABEL in ('label1', 'label2') 
  group by ID having count(*) = 1

謝謝

您可以使用 CTE 獲取與特定經理關聯的客戶標簽有效的出現次數:

with r as (select m.id id, sum(c.label in ('label1', 'label2')) c1, count(*) c2 
           from managers m join clients c on m.client_id = c.client_id group by m.id)
select id from r where c1 = c2;

Output:

ID
2
4

加入表,按經理分組並在HAVING子句中為您的條件使用條件聚合:

SELECT m.id
FROM managers m INNER JOIN clients c 
ON m.client_id = c.client_id
GROUP BY m.id
HAVING MAX(c.label IN ('label1', 'label2')) = 1
   AND MAX(c.label NOT IN ('label1', 'label2')) = 0

如果客戶端同時具有標簽'label1''label2'並且可以擴展到更多標簽,這也將起作用。

請參閱演示
結果:

ID
2
4

暫無
暫無

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

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