Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql组仅当连续日期_Mysql_Group Concat - Fatal编程技术网

mysql组仅当连续日期

mysql组仅当连续日期,mysql,group-concat,Mysql,Group Concat,我有一个带有日期字段的表。我需要一个查询,仅当日期连续时才将其分组,否则将分别返回 例如,如果我的表包含以下数据: +---------+--------------+ | user_id | checkin_date | +---------+--------------+ | 1 | 2012-02-01 | | 2 | 2012-03-01 | | 3 | 2012-02-03 | | 4 | 2012-02-02 | +--

我有一个带有日期字段的表。我需要一个查询,仅当日期连续时才将其分组,否则将分别返回

例如,如果我的表包含以下数据:

+---------+--------------+
| 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日被分为一行(仅显示第一天和最后一天),而3月1日本身就是

我不知道从哪里开始

提前感谢,


Alain

只有在签入日期与前一行不连续的情况下,即如果日期增加超过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 |
+------+------------+

请看小提琴。

我印象深刻!完美的+++
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              |
+-------------------------+
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