首页 > 解决方案 > 按用户分组选择 5 个连续日期的记录

问题描述

我有下面的表结构,我只想要那些在 5 个连续日期中并按 uid 分组的记录。

这是我的数据结构

用户主

uid | name
1   |  A
2   |  B
3   |  C
4   |  D

tbl_referral

refId   |  uid  |   Date
1       |  1    |   01-09-2018
2       |  1    |   02-09-2018
3       |  1    |   03-09-2018
4       |  2    |   01-09-2018
5       |  2    |   02-09-2018
6       |  1    |   04-09-2018
7       |  2    |   05-09-2018
8       |  2    |   06-09-2018
9       |  1    |   05-09-2018
10      |  2    |   06-09-2018

现在我只想从 tbl_referral 中获取那些日期连续出现 5 次的记录

所需的输出

uid | Date
    | 01-09-2018
    | 02-09-2018
1   | 03-09-2018
    | 04-09-2018
    | 05-09-2018

标签: mysqlsqldatabase

解决方案


您可以将表与自身连接起来并计算 5 天范围内的行数。如果计数为 5,则范围包含所有连续日期。

SELECT t1.uid, GROUP_CONCAT(t2.Date) AS dates
FROM tbl_referral AS t1
JOIN tbl_referral AS t2 ON t1.uid = t2.uid AND t2.date BETWEEN t1.date AND DATE_ADD(t1.date, INTERVAL 4 DAY)
GROUP BY t1.uid, t1.date
HAVING COUNT(*) = 5

此查询假定date列的数据类型是DATE,而不是字符串。如果它是一个字符串,您需要使用STR_TO_DATE()它来将其转换为尼克的答案中的日期。但是最好将日期存储为DATE而不是字符串,这样您就可以使用索引(它们也占用更少的空间)。


推荐阅读