MySQL中的分组:如何指定从其他列显示哪些数据

时间:2012-06-28 11:32:38

标签: mysql

对于含糊不清的标题感到抱歉;但我现在不知道如何描述它不同。

我有下表:

imei | date       | time  | some more fields
345  | 2012-06-28 | 07:18 | .....
345  | 2012-06-28 | 07:20 | .....
345  | 2012-06-28 | 07:21 | .....
987  | 2012-06-28 | 07:19 | .....
etc etc

我希望得到最新一排非常独特的imei,所以:

345  | 2012-06-28 | 07:21
987  | 2012-06-28 | 07:19
  • 使用SELECT * FROM t GROUP BY imei会导致使用第一行而不是最后一行。
  • time排序显然会命令结果关系而不是子。
  • 使用have只是为了陈述条件......

如何编写查询来执行此操作?

4 个答案:

答案 0 :(得分:4)

the manual中所述:

  

服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。此外,添加ORDER BY子句不会影响每个组中值的选择。选择值后会对结果集进行排序,ORDER BY不会影响服务器选择的值。

要获得groupwise maximum(如您所愿),您需要将分组子查询的结果与您的表联系起来:

SELECT * FROM t JOIN (
  SELECT imei, MAX(ADDTIME(date, time)) AS dt FROM t GROUP BY imei
) AS u ON t.imei = u.imei AND t.date = DATE(u.dt) AND t.time = TIME(u.dt)

答案 1 :(得分:0)

法希姆是对的。分隔的日期和时间列使生活变得不必要地困难。无论如何。

试试这个。

SELECT IMEI, MAX(STR_TO_DATE(CONCAT(`date`,` `,'`time`)))
  FROM T
 GROUP BY IMEI

你可能不得不将MAX / STR / CONCAT表达式恰到好处。

这是一个摘要查询,用于查找每个IMEI项目的最大日期时间。

答案 2 :(得分:0)

看一下那篇文章:How to combine date from one field with time from another field - MS SQL Server

为此,您只需使用SQL语句:

SELECT imei, (date+time) AS datim, [some more fields] FROM yourTable;

然后你可以在虚拟场datim上使用max,min,distinct。

答案 3 :(得分:-2)

也许您应该同时按imeidatetime订购:

SELECT * FROM t GROUP BY imei ORDER BY imei, date DESC, time DESC