列出mysql

时间:2016-05-14 12:11:37

标签: mysql sql sorting

我表中的每个项目(项目由Serial生成)有很多记录,我需要获取每个项目的最后一条记录,所以我运行下面的代码:

SELECT ID,Calendar,Serial,MAX(ID) 
FROM store 
GROUP BY Serial DESC

这意味着它必须显示每个项目的记录,在该记录中,所有列的数据都是与每个项目相关的最后一个记录,但结果如下:

-------------------------------------------------------------+
  ID    |            Calendar        |  Serial |    MAX(ID)  |
-------------------------------------------------------------|
7031053 |   2016-05-14 14:05:14 79.5 |  N10088 |    7031056  |
7053346 |   2016-05-14 15:17:28 79.8 |  N10078 |    7053346  |
7051349 |   2016-05-14 15:21:29 86.1 |  J20368 |    7051349  |
7059144 |   2016-05-14 15:50:27 89.6 |  J20367 |    7059144  |
7045551 |   2016-05-14 15:15:15 89.2 |  J20366 |    7045551  |
7056243 |   2016-05-14 15:25:34 85.2 |  J20358 |    7056245  |
7042652 |   2016-05-14 15:18:33 83.9 |  J20160 |    7042652  |
7039753 |   2016-05-14 11:48:16 87   |  J20158 |    7039753  |
7036854 |   2016-05-14 15:18:35 87.5 |  J20128 |    7036854  |
7033955 |   2016-05-14 15:20:45 83.4 |  9662   |    7033955  |
-------------------------------------------------------------+

问题是为什么例如在与Serial N10088相关的记录中,ID是“7031053”,但MAX(ID)是“7031056”?还是J20358?

每一行必须显示每个项目的最后一条记录,但在我的输出中却不是这样!

3 个答案:

答案 0 :(得分:1)

如果您希望行具有最大值,则需要连接或其他一些机制。

以下是使用相关子查询的简单方法:

select s.*
from store s
where s.id = (
   select max(s2.id) 
   from store s2 
   where s2.serial = s.serial
);

您查询使用SQL Server的(错误)功能会产生很多混淆并且不是特别有用:select中的列不在group by中。这些有什么价值?

好吧,在大多数数据库中,答案很简单:查询会生成ANSI指定的错误。 MySQL从不确定的匹配行中提取其他列的值。这很少是查询的作者想要的。

为了提高性能,请在store(serial, id)上添加索引。

答案 1 :(得分:1)

尝试这个。

SELECT MAX(id), tbl.*
FROM store tbl
GROUP BY Serial 

答案 2 :(得分:0)

你也可以试试这个......

   SELECT ID,Calendar,Serial 
    FROM store s0
    where ID = (
       SELECT MAX(id) 
       FROM store s1 
       WHERE s1.serial = s0.serial
    );