php mysql Group By获取最新记录,而不是第一条记录

sha*_*ebp 16 php mysql

桌子:

(`post_id`, `forum_id`, `topic_id`, `post_time`) 
(79, 8, 4, '2012-11-19 06:58:08');
(80, 3, 3, '2012-11-19 06:58:42'),
(81, 9, 9, '2012-11-19 06:59:04'),
(82, 11, 6, '2012-11-19 16:05:39'),
(83, 9, 9, '2012-11-19 16:07:46'),
(84, 9, 11, '2012-11-19 16:09:33'),
Run Code Online (Sandbox Code Playgroud)

查询:

SELECT  post_id, forum_id, topic_id FROM posts 
GROUP BY topic_id 
ORDER BY post_time DESC
LIMIT 5
Run Code Online (Sandbox Code Playgroud)

结果:

[0] => [post_id] => 84 [forum_id] => 9 [topic_id] => 11  
[1] => [post_id] => 82 [forum_id] => 11 [topic_id] => 6  
[2] => [post_id] => 81 [forum_id] => 9 [topic_id] => 9  
[3] => [post_id] => 80 [forum_id] => 3 [topic_id] => 3  
[4] => [post_id] => 79 [forum_id] => 8 [topic_id] => 4
Run Code Online (Sandbox Code Playgroud)

问题:

如何重写查询,使其返回post_id - > 83而不是post_id - > 81?

它们都有相同的论坛和主题ID,但是post_id - > 81的日期比post_id更早 - > 83.

但似乎Group By获得了"第一"记录,而不是"最新"记录.

我尝试将查询更改为

SELECT  post_id, forum_id, topic_id, MAX(post_time)
Run Code Online (Sandbox Code Playgroud)

但是返回post_id 81和83

Ter*_* D. 26

如果选择未在group子句中使用但未聚合的属性,则结果未指定.即,您不知道从哪个行中选择其他属性.(sql标准不允许这样的查询,但MySQL更放松).

然后应该将查询写成例如

SELECT post_id, forum_id, topic_id
FROM posts p
WHERE post_time =
  (SELECT max(post_time) FROM posts p2
   WHERE p2.topic_id = p.topic_id
   AND p2.forum_id = p.forum_id)
GROUP BY forum_id, topic_id, post_id
ORDER BY post_time DESC
LIMIT 5;
Run Code Online (Sandbox Code Playgroud)

要么

SELECT post_id, forum_id, topic_id FROM posts
NATURAL JOIN
(SELECT forum_id, topic_id, max(post_time) AS post_time
 FROM posts
 GROUP BY forum_id, topic_id) p
ORDER BY post_time
LIMIT 5;
Run Code Online (Sandbox Code Playgroud)


Alv*_*ome 10

它不是很漂亮,但它有效:

SELECT * FROM (SELECT  post_id, forum_id, topic_id FROM posts
ORDER BY post_time DESC) as temp
GROUP BY topic_id
Run Code Online (Sandbox Code Playgroud)

  • 将此添加到您的查询使其工作:ORDER BY post_time DESC LIMIT 5 (2认同)