[英]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 by
並having
此處聲明以獲取唯一記錄
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.