如何使用mysql选择两种类型并按月计算id?

时间:2016-08-19 11:49:55

标签: php mysql

我有一张桌子。我需要获取结果并在折线图中显示。我需要计数结果(id)并明智地输入。我尝试了一个查询但没有工作。在图表中,我需要显示两种类型(预订和会员资格)。是否可以在单个查询中获得两种类型并按月计算?

SQL查询

 SELECT COUNT(id), type, MONTHNAME(created_at) FROM orders WHERE YEAR(created_at) = 2016 ORDER BY created_at GROUP BY MONTH(created_at)

订单表

 id     type        created_at  
  1     booking     2016-01-12
  2     membership  2016-01-12
  3     booking     2016-05-11
  4     booking     2016-05-15
  5     booking     2016-07-07
  6     membership  2016-07-08
  7     membership  2016-07-09
  8     membership  2016-08-16
  9     booking     2016-08-17
  10    membership  2016-08-19

期望输出为: 例如:在这种情况下(2016-07-07)我需要数量是3,类型是"预订,会员资格,会员资格"

2 个答案:

答案 0 :(得分:1)

我认为你只想要条件聚合:

SELECT MONTHNAME(created_at),
       SUM(type = 'Booking') as Booking,
       SUM(type = 'Membership') as Membership
FROM orders
WHERE YEAR(created_at) = 2016 
GROUP BY MONTH(created_at)
ORDER BY MIN(created_at );

注意:

  • 我通常将GROUP BY列放在聚合查询中,然后将计算后的列放在后面。 (个人喜好)。
  • MySQL将布尔表达式视为" 1"为真和" 0"如果为false,则SUM()计算真值的数量。在大多数其他数据库中,您需要使用CASE表达式。
  • ORDER BY位于GROUP BY
  • 之后
  • 创建聚合查询时,不要学习坏习惯。因此,我在CREATED_AT周围放置了一个聚合函数,因为不在GROUP BY中的列永远不应该是#34;裸#34;

答案 1 :(得分:0)

您好,您应该使用GROUP_CONCAT

GROUP_CONCAT() - function返回一个字符串,其中包含来自组的串联非NULL值。

所以你的查询应该像

SELECT count(id) as total, GROUP_CONCAT(type) as Types, MONTHNAME(created_at) as MONTH from orders group by MONTH(created_at)