如果我运行以下查询:
SELECT *
FROM `smp_data_log`
WHERE Post_id = 1234 AND Account_id = 1306
ORDER BY Created_time DESC
我得到7行,包括具有以下Created_times的条目:
1)1424134801
2)1424134801
3)1421802001
4)3601
如果我运行以下查询:
SELECT mytable.*
FROM (SELECT * FROM `smp_data_log` ORDER BY Created_time DESC) AS mytable
WHERE Post_id = 1234 AND Account_id = 1306
GROUP BY Post_id
我希望看到1424134801作为单行返回 - 但我看到3601?我原本以为这会回到最新时间(因为它的下降)。我做错了什么?
答案 0 :(得分:1)
你的期望是错误的。这在MySQL中有很好的记录。您正在使用扩展程序,select
中的列不在group by
中 - 这是一种非常糟糕的习惯,而且在其他数据库中不起作用(在某些特殊情况下除外) ANSI标准允许的。)
只需使用join
即可获得您真正想要的内容:
SELECT l.*
FROM smp_data_log l JOIN
(select post_id, max(created_time) as maxct
from smp_data_log
group by post_id
) lmax
on lmax.post_id = l.post_id and lmax.maxct = l.created_time;
以下是documentation:
的引用MySQL扩展了GROUP BY的使用,以便选择列表可以引用 未在GROUP BY子句中命名的非聚合列。这意味着 前面的查询在MySQL中是合法的。您可以使用此功能 通过避免不必要的列排序来获得更好的性能 分组。但是,这主要适用于每个中的所有值 GROUP BY中未命名的非聚合列对于每个列都是相同的 组。服务器可以自由选择每个组中的任何值,所以 除非它们相同,否则所选择的值是不确定的。