我在返回有序/分组查询中的某些行时遇到问题。
我试图在表上获取类型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
谢谢!
答案 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模式的情况下,查询将为被认为无效。