MYSQL GROUP BY不返回有序选择中的第一行

时间:2019-07-19 17:56:35

标签: mysql group-by

我在返回有序/分组查询中的某些行时遇到问题。

我试图在表上获取类型2的最新行,因此我先使用ORDER,然后使用GROUP。

示例表:

id    type   field1     date (dd/mm/yyyy)
1     1      texta      01/01/2019
2     1      textb      02/01/2019
3     2      textc      01/01/2019
4     2      textd      02/01/2019
5     2      texte      03/01/2019

如果我这样做

SELECT * FROM cars WHERE type = 2 ORDER BY date DESC

它返回:

id    type    field1     date
5     2       texte      03/01/2019
4     2       textd      02/01/2019
3     2       textc      01/01/2019

那么我愿意

SELECT a.* 
FROM ( SELECT * FROM cars WHERE type = 2 ORDER BY date DESC ) a 
GROUP BY a.type

我得到:

id    type    field1     date
3     2       textc      01/01/2019

GROUP BY是否没有获得组的第一行?我如何获得最新的行,如:

id    type    field1     date
5     2       texte      03/01/2019

谢谢!

3 个答案:

答案 0 :(得分:0)

首先,据我所知,您的查询应该可以正常运行。可能是注释中建议的MySQL版本问题

请问您的问题,解决方案应该是不使用GROUP BY到达解决方案。 ORDER BY + LIMIT怎么样 例如:

SELECT * FROM cars WHERE type = 2 ORDER BY date DESC LIMIT 1;

在这种情况下,order by首先将所需的行带入,限制使得仅返回一行。

另一种效率较低的方法是通过LEFT JOIN + NULL

SELECT * FROM cars 
LEFT JOIN cars2 ON cars.type = cars2.type AND cars2.date > cars.date
WHERE type = 2
AND cars2.id IS NULL
LIMIT 1;

在这种方法中,不等式强制tye最新行不连接到另一个表 根据该条件进行过滤将提取最后一行

答案 1 :(得分:0)

  

获取每种类型的最新行

您可以使用NOT EXISTS:

select c.* 
from cars c 
where not exists (
  select 1 from cars
  where type = c.type and date > c.date
)

答案 2 :(得分:0)

MySQL不能保证非聚合列的分组依据中的行顺序,因此您编写的查询将无法始终如一地工作,并且会产生不确定的值。

要获取所需的数据,可以执行以下查询:

SELECT * 
FROM cars
WHERE date = (SELECT date FROM cars WHERE type = 2 ORDER BY date DESC limit 1)

在查询中,您正在按类型分组,但是尝试获取不属于聚合的所有其他列,因此它将无法正常工作,并且在启用ONLY_FULL_GROUP_BY SQL模式的情况下,查询将为被认为无效。