为此找了几个小时,我找不到任何相关的东西,所以我会问。我有一个这样的数据库:
id | date | name
1 |2017-01-01 | sarah
2 |2017-01-02 | sarah
3 |2017-01-03 | john
4 |2017-01-04 | john
5 |2017-01-05 | john
6 |2017-01-06 | sarah
7 |2017-01-07 | sarah
8 |2017-01-08 | eddy
9 |2017-01-09 | eddy
我想制作如下列表:
start date | end date | name
2017-01-01 | 2017-01-02 | sarah
2017-01-03 | 2017-01-05 | john
2017-01-06 | 2017-01-07 | sarah
2017-01-08 | 2017-01-09 | eddy
我怎样才能做到这一点?一直在尝试使用:
SELECT MIN(date) as mindate, MAX(date) as maxdate, name
FROM 'table'
GROUP BY name
ORDER BY date DESC
但我得到的是这些:
start date | end date | name
2017-01-01 | 2017-01-07 | sarah
2017-01-03 | 2017-01-05 | john
2017-01-08 | 2017-01-09 | eddy
请注意,在我想要的列表中,名字 SARAH 出现了两次,而对于 GROUP BY,Sarah 只出现了一次......
最佳答案
一种选择是使用行号变量来标识每个岛屿的开始和结束日期。最终结果与您最初预期的逻辑类似,只是现在我们要获取每个岛屿的开始和结束日期,而不是整个表中的每个名称。
SET @island_number = 0;
SET @name = '';
SELECT MIN(t.date) AS start_date,
MAX(t.date) AS end_date,
t.name
FROM
(
SELECT @island_number:=CASE WHEN @name = name
THEN @island_number
ELSE @island_number + 1
END AS gn,
@name:=name AS name,
date
FROM yourTable
ORDER BY id
) t
GROUP BY t.gn, t.name
关于mysql - 显示同一组的 SQL 数据库出现两次或更多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42324168/