MySQL计算数据透视表上至少有一条记录的所有记录

时间:2019-04-14 22:01:08

标签: mysql

我正在尝试查看一个表的记录是否在用于多对多关系的数据透视表上至少有一个记录。

话务员是:

| 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   |

之所以可以预期,是因为:

  1. 只有ID为1和3的话务员才在Attendant_Event表上有一条记录。这告诉我们,数据透视表上带有行的话务员数量为2。
  2. ID为2的话务员没有记录,因此数据透视表上没有记录的话务员为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个而不是我要的两个。

我做错了什么?

2 个答案:

答案 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