【问题标题】:mysql group_concat only if consecutive datesmysql group_concat 仅在连续日期时
【发布时间】:2014-03-12 23:19:42
【问题描述】:

我有一个带有日期字段的表格。只有当日期是连续的时,我才需要查询 group_concat 日期,否则单独返回它们。

所以,例如,如果我的表有以下数据:

+---------+--------------+
| user_id | checkin_date |
+---------+--------------+
|       1 | 2012-02-01   |
|       2 | 2012-03-01   |
|       3 | 2012-02-03   |
|       4 | 2012-02-02   |
+---------+--------------+

我需要一个可以返回以下结果的查询

+--------------------------+
| checkin_period           |
+--------------------------+
| 2012-02-01 - 2012-02-03  |
| 2012-03-01               |
+--------------------------+

如您所见,2 月 1 日、2 日和 3 日已分组为 1 行(仅显示第一天和最后一天),而 3 月 1 日是单独的...

我不知道从哪里开始!

提前致谢,

阿兰

【问题讨论】:

    标签: mysql group-concat


    【解决方案1】:

    仅当 checkin_date 与前一行不连续时,即日期增加超过 1 天时,您才可以增加用户变量 @p

    SELECT IF(checkin_date <= @d + INTERVAL 1 DAY, @p, @p:=@p+1) AS p, @d:=checkin_date AS d
    FROM (SELECT @p:=0, @d:='1900-01-01') _init, mytable 
    ORDER BY checkin_date;
    
    +------+------------+
    | p    | d          |
    +------+------------+
    |    1 | 2012-02-01 |
    |    1 | 2012-02-02 |
    |    1 | 2012-02-03 |
    |    2 | 2012-03-01 |
    +------+------------+
    

    然后将上面的内容用作子查询,按p 列分组,并返回一个最小到最大范围的字符串,如果组内的计数为 1,则返回一个值。

    SELECT IF(COUNT(*) > 1, CONCAT(MIN(d), ' - ', MAX(d)), MAX(d)) AS date_range 
    FROM (
      SELECT IF(checkin_date <= @d + INTERVAL 1 DAY, @p, @p:=@p+1) AS p, @d:=checkin_date AS d
      FROM (SELECT @p:=0, @d:='1900-01-01') _init, mytable 
      ORDER BY checkin_date) AS t 
    GROUP BY p;
    
    +-------------------------+
    | date_range              |
    +-------------------------+
    | 2012-02-01 - 2012-02-03 |
    | 2012-03-01              |
    +-------------------------+
    

    【讨论】:

      【解决方案2】:
      SELECT
        CONCAT_WS(' - ',
          MIN(checkin_date),
          CASE WHEN MAX(checkin_date)>MIN(checkin_date) THEN MAX(checkin_date) END
        ) As time_interval
      FROM (
        SELECT
          CASE WHEN checkin_date=@last_ci+INTERVAL 1 DAY THEN @n ELSE @n:=@n+1 END AS g,
          @last_ci := checkin_date As checkin_date
        FROM
          tablename, (SELECT @n:=0) r
        ORDER BY
          checkin_date
      ) s
      GROUP BY
        g
      

      请看小提琴here

      【讨论】:

      • 我印象深刻!完美+++
      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 2021-08-19
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多