分组依据、IFNULL 和按日期排序
Posted
技术标签:
【中文标题】分组依据、IFNULL 和按日期排序【英文标题】:Group By, IFNULL and Order By date 【发布时间】:2021-12-07 08:23:33 【问题描述】:我必须获取按类型分组的表中的行(如果它们不为空)和用户。按时间订购。但是分组必须分开...
这是我的桌子:
id | event_code | user | time |
---|---|---|---|
10 | A | 6 | 2021-10-20 09:59:00 |
9 | null | 6 | 2021-10-20 09:56:00 |
8 | null | 6 | 2021-10-20 09:54:00 |
7 | A | 6 | 2021-10-20 09:53:00 |
6 | A | 6 | 2021-10-20 09:52:00 |
5 | null | 6 | 2021-10-20 09:51:00 |
4 | null | 4 | 2021-10-20 09:50:00 |
3 | B | 6 | 2021-10-20 09:49:00 |
2 | B | 6 | 2021-10-20 09:48:00 |
1 | B | 12 | 2021-10-20 09:43:00 |
我想得到这个:
id | event_code | user | time | number |
---|---|---|---|---|
10 | A | 6 | 2021-10-20 09:55:00 | 1 |
9 | null | 6 | 2021-10-20 09:54:00 | 1 |
8 | null | 6 | 2021-10-20 09:54:00 | 1 |
7,6 | A | 6 | 2021-10-20 09:53:00 | 2 |
5 | null | 6 | 2021-10-20 09:51:00 | 1 |
4 | null | 4 | 2021-10-20 09:50:00 | 1 |
3,2 | B | 6 | 2021-10-20 09:49:00 | 2 |
1 | B | 12 | 2021-10-20 09:43:00 | 1 |
【问题讨论】:
【参考方案1】:我找到了这个解决方案:
SELECT GROUP_CONCAT(id),event_code,user,time FROM(
SELECT
id,event_code,user,time,
if(@a = event_code, @b, @b := @b + 1) as grouping_col,
@a := event_code
FROM testing
JOIN (select @a := 1, @b := 0) as temp
) as t
GROUP BY grouping_col,user
http://sqlfiddle.com/#!9/abfcd4/17
但是,我如何按时间对分组的行进行排序? 我会有 7,6 但我有 6,7。
【讨论】:
【参考方案2】:@gasmor 要保持订单,您应该在 group_concat 子句中包含订单语句,更多信息请参见:https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_group-concat,例如:
SELECT GROUP_CONCAT( id order by `time` desc),event_code,user,time
FROM ( SELECT
id,
event_code,
`user`,
`time`,
if(@a = event_code, @b, @b := @b + 1) as grouping_col,
@a := event_code
FROM testing
JOIN (
select @a := 1, @b := 0) as temp
) as t
GROUP BY grouping_col,user ;
演示:https://www.db-fiddle.com/f/vhqJXYFy52xRtVBc97R1EL/4
当你使用 group by 时,你应该记住:
所选列应属于 group by 或属于
SUMN()
、MAX()
等聚合函数...
【讨论】:
以上是关于分组依据、IFNULL 和按日期排序的主要内容,如果未能解决你的问题,请参考以下文章