在 MySQL 中的同一字段上使用多个 group_concats 和分组依据
Using multiple group_concats and group by on the same field in MySQL
我正在尝试编写一个查询来跟踪一个月内发生的事件,每个月的每一天都是结果的一列。当尝试对一个月中的每一天使用 group_concat 时,仅返回第一次出现的日期。我在下面列出了我正在使用的 2 个表的模式和数据,以及我希望看到的结果和我尝试过的 SQL 查询。
注意:为了找到问题的根源,我已经尽可能地简化了数据和架构。
追踪
tracking_id | date
_______________________________________
1 | 2017-05-01
2 | 2017-05-02
跟踪状态
trackingstatus_id | tracking_id | time
___________________________________________
1 | 1 | 09:00
2 | 2 | 10:00
3 | 2 | 14:00
想要的结果
Month | Day1 | Day2
5 | 09:00 | 10:00,14:00
我尝试了以下查询
SELECT
MONTH(date),
if( date = '2017-05-01', group_concat(timeadministered), NULL ),
if( date = '2017-05-02', group_concat(timeadministered), NULL )
FROM trackingstatus ts
JOIN tracking t ON t.tracking_id = ts.tracking_id
GROUP BY MONTH(date)
但得到以下结果
Month | Day1 | Day2
5 | 09:00,10:00,14:00 |
我知道当我在日期上使用分组依据时,该行仅识别第一个日期值。有没有更好的方法来解决这个问题然后使用 group by 和 group_concat?
您可能需要一个聚合函数围绕 SELECT 列表中的表达式。但是围绕 GROUP_CONCAT 包装另一个聚合没有多大意义,因为 GROUP BY 子句中的表达式意味着您每个月只会返回一行。
也许你想要这样的东西:
SELECT MONTH(t.date)
, GROUP_CONCAT(IF(t.date = '2017-05-01',t.timeadministered,NULL)) AS Day01
, GROUP_CONCAT(IF(t.date = '2017-05-02',t.timeadministered,NULL)) AS Day02
FROM ...
GROUP BY MONTH(t.date)
我正在尝试编写一个查询来跟踪一个月内发生的事件,每个月的每一天都是结果的一列。当尝试对一个月中的每一天使用 group_concat 时,仅返回第一次出现的日期。我在下面列出了我正在使用的 2 个表的模式和数据,以及我希望看到的结果和我尝试过的 SQL 查询。
注意:为了找到问题的根源,我已经尽可能地简化了数据和架构。
追踪
tracking_id | date
_______________________________________
1 | 2017-05-01
2 | 2017-05-02
跟踪状态
trackingstatus_id | tracking_id | time
___________________________________________
1 | 1 | 09:00
2 | 2 | 10:00
3 | 2 | 14:00
想要的结果
Month | Day1 | Day2
5 | 09:00 | 10:00,14:00
我尝试了以下查询
SELECT
MONTH(date),
if( date = '2017-05-01', group_concat(timeadministered), NULL ),
if( date = '2017-05-02', group_concat(timeadministered), NULL )
FROM trackingstatus ts
JOIN tracking t ON t.tracking_id = ts.tracking_id
GROUP BY MONTH(date)
但得到以下结果
Month | Day1 | Day2
5 | 09:00,10:00,14:00 |
我知道当我在日期上使用分组依据时,该行仅识别第一个日期值。有没有更好的方法来解决这个问题然后使用 group by 和 group_concat?
您可能需要一个聚合函数围绕 SELECT 列表中的表达式。但是围绕 GROUP_CONCAT 包装另一个聚合没有多大意义,因为 GROUP BY 子句中的表达式意味着您每个月只会返回一行。
也许你想要这样的东西:
SELECT MONTH(t.date)
, GROUP_CONCAT(IF(t.date = '2017-05-01',t.timeadministered,NULL)) AS Day01
, GROUP_CONCAT(IF(t.date = '2017-05-02',t.timeadministered,NULL)) AS Day02
FROM ...
GROUP BY MONTH(t.date)