【问题标题】:Can I select last, first row of GROUP BY query in MySQL?我可以在 MySQL 中选择 GROUP BY 查询的最后一行吗?
【发布时间】:2011-09-10 21:15:04
【问题描述】:

[使用 MySQL] 有一个表messages包含如下数据:

Id   Name   Other_Columns
-------------------------
1    A       A1
2    A       A2
3    A       A3
4    B       B1
5    B       B2
6    C       C1
7    A       A4
8    A       A5

什么查询会返回以下结果?

1    A       (A3 - A1)
4    B       (B2 - B1)
6    C       (C1 - C1)
7    A       (A5 - A4)

【问题讨论】:

  • “其他列”的输出在结果中令人困惑。你想显示一个范围吗?减法?还有什么?
  • 另外,您要选择第一个和最后一个吗?还是先?还是最后一个?标题令人困惑。

标签: mysql select gaps-and-islands


【解决方案1】:

试试这个

select min(ID) as FirstId,Name,
       Concat(max(Other_columns),"-",min(Other_Columns)) as Ans
from msgtable
group by Name

【讨论】:

  • 啊刚刚看到这个问题。所需的结果有两个 A 行。 OP 需要间隙和孤岛类型查询。
  • 很好,马丁。看起来像一个简单的 group by 和 concat,但最后一个 A 使它更加复杂......
【解决方案2】:
SELECT Bottom_one.Id,Bottom_one.Name ,Bottom_one.Other_Columns

FROM `T1` as Top_one

Right JOIN T1 AS Bottom_one
ON Top_one.Id = Bottom_one.Id - 1

WHERE Top_one.Name IS NULL OR Top_one.Name != Bottom_one.Name

给出一个接近的结果:

Id  Name    Other_Columns
1   A       A1
4   B       B1
6   C       C1
7   A       A4

还有这个:

SELECT Top_one.Id,Top_one.Name ,Top_one.Other_Columns

FROM `T1` as Top_one

Left JOIN T1 AS Bottom_one
ON Top_one.Id = Bottom_one.Id - 1

WHERE Bottom_one.Name IS NULL OR Top_one.Name != Bottom_one.Name

在 Other_Columns 中给出其他限制

Id  Name    Other_Columns
3   A       A3
5   B       B2
6   C       C1
8   A       A5

我不知道如何将它们组合成一个 SQL 语句。 (当然,以编程方式做是微不足道的)

这是一个表格转储,如果其他人想玩的话。

CREATE TABLE IF NOT EXISTS `T1` (
  `Id` int(11) NOT NULL auto_increment,
  `Name` varchar(255) NOT NULL,
  `Other_Columns` varchar(255) NOT NULL,
  PRIMARY KEY  (`Id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;

INSERT INTO `T1` (`Id`, `Name`, `Other_Columns`) VALUES
(1, 'A', 'A1'),
(2, 'A', 'A2'),
(3, 'A', 'A3'),
(4, 'B', 'B1'),
(5, 'B', 'B2'),
(6, 'C', 'C1'),
(7, 'A', 'A4'),
(8, 'A', 'A5');

很好的拼图!

【讨论】:

    猜你喜欢
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 2013-03-03
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多