例如:
id | date
---+------------
1 | 2011-01-01
2 | 2011-01-02
3 | 2011-01-15
4 | 2011-01-20
5 | 2011-01-10
6 | 2011-01-30
7 | 2011-01-03
8 | 2011-02-09
9 | 2011-02-10
10 | 2011-02-11
11 | 2011-02-12
12 | 2011-02-15
13 | 2011-02-19
14 | 2011-02-21
15 | 2011-02-22
16 | 2011-02-23
17 | 2011-02-24
以下是一些行(日期可能总是按顺序排列)。 多条记录的日期与可能的情况相同 。我想抓住连续日期的行。例如;对于以上条目,我想要类似的东西:
id | date
---+------------
1 | 2011-01-01
2 | 2011-01-02
7 | 2011-01-03
8 | 2011-02-09
9 | 2011-02-10
10 | 2011-02-11
11 | 2011-02-12
14 | 2011-02-21
15 | 2011-02-22
16 | 2011-02-23
17 | 2011-02-24
我尝试过类似的事情:
SELECT a.id, a.date FROM tbl a
LEFT JOIN tbl b on a.user_id = b.user_id AND a.date = b.date + INTERVAL 1 DAY
但它并没有给我正确的结果,而且速度要慢得多。所以请指导我一些正确的过程,并且更快。
注意:它实际上是一个出勤计划,因此多个用户应该拥有相同日期的记录。所以我需要所有用户连续日期的所有记录。
答案 0 :(得分:1)
首先在日期列上创建索引:
create index idx_tbl_date on tbl(date);
然后,我认为以下内容会做你想要的:
select t.*
from tbl t
where exists (select 1 from tbl t2 where t2.date = t.date + interval 1 day) or
exists (select 1 from tbl t2 where t2.date = t.date - interval 1 day);
这两个存在子句确保您获得序列中的第一个和最后一个日期。使用索引,这应该表现良好。
答案 1 :(得分:1)
不是那么微不足道,因为它总是难以拥有第一行或最后一行。这是
mysql> SET @a:=NULL;
SELECT DISTINCT m.id, m.date
FROM mytable3 m,
(SELECT IF(date<=DATE_ADD(@a, INTERVAL 1 DAY), @a, NULL) start,
@a:=date next
FROM mytable3 ORDER BY date) m2
WHERE m.date=m2.start
OR (m.date=m2.next AND m2.start IS NOT NULL);
查询OK,0行受影响(0.00秒)
+----+------------+
| id | date |
+----+------------+
| 1 | 2011-01-01 |
| 2 | 2011-01-02 |
| 7 | 2011-01-03 |
| 8 | 2011-02-09 |
| 9 | 2011-02-10 |
| 10 | 2011-02-11 |
| 11 | 2011-02-12 |
| 14 | 2011-02-21 |
| 15 | 2011-02-22 |
| 16 | 2011-02-23 |
| 17 | 2011-02-24 |
+----+------------+
11行(0.08秒)
如果您不想使用变量,您还可以使用以下内容:
SELECT DISTINCT m.id, m.date
FROM mytable3 m,
(SELECT m1.date start, m2.date next FROM mytable3 m1, mytable3 m2
WHERE m2.date<=DATE_ADD(m1.date, INTERVAL 1 DAY) AND m2.date>m1.date) m2
WHERE m.date=m2.start
OR (m.date=m2.next AND m2.start IS NOT NULL);
答案 2 :(得分:0)
SELECT a.id, a.date FROM a
LEFT JOIN b on a.id = b.id AND a.date <= b.date + INTERVAL '1 day'
ORDER BY a.date;
语法INTERVAL 1 DAY
错误,我认为您正在寻找INTERVAL '1 day'
。此外,如果我正确理解您的问题而我可能没有,您可能希望使用&lt; =而不是=来检查日期是否在1天内。希望这会有所帮助。