0

如果我运行以下查询:

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

4

1 回答 1

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;

这是文档中的引用:

MySQL 扩展了 GROUP BY 的使用,以便选择列表可以引用未在 GROUP BY 子句中命名的非聚合列。这意味着前面的查询在 MySQL 中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在每个未在 GROUP BY 中命名的非聚合列中的所有值对于每个组都相同时很有用。服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的

于 2015-02-19T14:24:55.997 回答