mysql:在条件不同的情况下做的情况

时间:2017-05-09 15:04:57

标签: mysql enums distinct

我有两个表,id是连接它们的关键。在一个表中有重复的id,状态列是枚举类型。另一个也有id,但它是唯一的,并且有像联合日期这样的列。我必须知道有多少用户按月和年加入,所以我必须按年和月分组。这是我到目前为止的查询。

SELECT year(member.joined) AS year, 
       month(member.joined) AS month, 
       count(DISTINCT member.id) AS count 
FROM member 
WHERE member.id NOT IN 
(SELECT internal.worker_id FROM internal) 
GROUP BY year(member.joined), month(member.joined);

这给了我这样的结果。

year        month         count
1982         12            43           
1978         11             1

但是,我也必须弄清楚用户类型的数量,这是我想得到的结果。

year        month         count     red   green  blue  
1982        12             43         1    40     2
1978        11             1          0     1     0

所以我尝试通过添加枚举列的名称来编辑查询,这些类型具有这样的类型。

count(DISTINCT member.id) AS count,
count(case c.`types` when 'red' then 1 else 0 end)as 'red',
count(case c.`types` when 'green' then 1 else 0 end)as 'green',
count(case c.`types` when 'blue' then 1 else 0 end)as 'blue'

我收到一条错误消息,指出mysql语法不正确。我尝试了这个查询而没有做count(distint member.id)AS计数,并且它有效。然而,结果只是显示所有内容而不删除重复项,因此数量为' count'和其他像红色,绿色,蓝色不匹配。 我想知道是否有可能获得我想要的结果。

2 个答案:

答案 0 :(得分:0)

您是否尝试过(CASE WHEN c.types='red' THEN 1 ELSE 0 END)语法?它是the docs中列出的第二个版本。此外,确切的查询和错误消息会有所帮助 - 例如,表格' c'这里有联系吗?

答案 1 :(得分:0)

尝试以下查询:

SELECT year(member.joined) AS year, 
       month(member.joined) AS month, 
       count(DISTINCT member.id) AS count,
       sum(if(member.`types` like 'red', 1, 0)) as 'red',
       sum(if(member.`types` like 'green', 1, 0))as 'green',
       sum(if(member.types like 'blue', 1, 0))as 'blue'
FROM member 
GROUP BY year(member.joined), month(member.joined);

在此上下文中使用group by时,最好使用sum和if()子句