Mysql派生表顺序依次为

时间:2015-02-19 14:21:18

标签: mysql derived-table

如果我运行以下查询:

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?我原本以为这会回到最新时间(因为它的下降)。我做错了什么?

1 个答案:

答案 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中未命名的非聚合列对于每个列都是相同的   组。服务器可以自由选择每个组中的任何值,所以   除非它们相同,否则所选择的值是不确定的