我正在尝试查看一个表的记录是否在用于多对多关系的数据透视表上至少有一个记录。
话务员是:
| ID | NAME |
|----|--------|
| 1 | Name A |
| 2 | Name B |
| 3 | Name C |
并且Attendant_Event数据透视表具有以下结构
| ID | attendant_id | event_id | uuid |
|----|----------------|------------|--------|
| 1 | 1 | 1 | xxx |
| 2 | 1 | 2 | yyy |
| 3 | 3 | 1 | zzz |
| 4 | 3 | 2 | www |
| 5 | 1 | 3 | xyx |
| 6 | 3 | 3 | rer |
我的查询正在尝试对数据透视表上具有至少一条记录的服务员进行计数,但将所有记录都视为一个。 例如,预期结果将是一个像这样的表:
| STATUS | COUNT |
|--------|--------|
| YES | 2 |
| NO | 1 |
之所以可以预期,是因为:
现在,我的查询如下:
SELECT IF(uuid <=> NULL, 'NO', 'YES') as status, count(*) as count FROM attendants att LEFT JOIN attendant_event ae ON ae.attendant_id = att.id GROUP BY status
但这显示了这样的结果。
| STATUS | COUNT |
|--------|--------|
| YES | 6 |
| NO | 1 |
这意味着,对每一行进行计数。如果我们以前面的示例为例,则ID为1和3的话务员在数据透视表上都有 3 条记录。所以它给出了6个而不是我要的两个。
我做错了什么?
答案 0 :(得分:1)
您可能需要先选择具有各自的是/否的话务员ID,然后再对它们进行计数,例如:
SELECT status, count(distinct attendant_id) as count FROM (
SELECT IF(ae.uuid IS NULL, 'NO', 'YES') as status, ae.attendant_id
FROM attendants att LEFT JOIN attendant_event ae ON ae.attendant_id = att.id
GROUP BY ae.attendant_id) x
GROUP BY status
答案 1 :(得分:0)
当您进行左联接时,您将创建相交,该相交大于服务员表。您的联接由重复attendant_id
和不同事件uuid
的行组成。
您可以通过执行SELECT IF(uuid <=> NULL, 'NO', 'YES') as status, att.id, ae.uuid FROM attendants att LEFT JOIN attendant_event ae ON ae.attendant_id = att.id
来观察交点。它包括7行,其中6行在两个活动出席者中具有YES事件,而1行则具有NO事件。
因此,您应该只计算与众不同的值:
SELECT IF(uuid <=> NULL, 'NO', 'YES') as status, count(distinct(att.id)) as count
FROM attendants att
LEFT JOIN attendant_event ae ON ae.attendant_id = att.id
GROUP BY status