mysql - 显示同一组的 SQL 数据库出现两次或更多次

标签 mysql

为此找了几个小时,我找不到任何相关的东西,所以我会问。我有一个这样的数据库:

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/

相关文章:

mysql - 将行转换为列 - 一张表

php - Laravel 在创建模型时使用不正确的表名

C# PHP 通信

php - 带有 INNER JOIN 的 MySQL SELECT 2 表

php - 如何使用 SUM() 和 MAX() 左连接按日期分组的 2 个表

mysql - 在 MySQL 触发器中创建变量

php - 使用单个 ID 列引用多个表

mysql - 配置 MySQL 定期转储所有数据

php - 检查数据库中是否存在ID

mysql - 在一个查询中计算 mysql 中的 group_concat