我有一个带有时间戳行的表格:比如说,有一些作者提要:
CREATE TEMPORARY TABLE `feed` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`author` VARCHAR(255) NOT NULL,
`tm` DATETIME NOT NULL
);
我想按tm DESC
排序,但是这样一来,一位作者的行就会粘在一起。
例如,有
INSERT INTO `feed` VALUES
( 5, 'peter', NOW()+1 ),
( 4, 'helen', NOW()-1 ),
( 3, 'helen', NOW()-2 ),
( 2, 'peter', NOW()-10 ),
( 1, 'peter', NOW()-11 );
结果集应按tm DESC
排序,但所有 peter 帖子都是首先发布的,因为他的帖子是最新的。下一组行应来自author
和最近的第2篇帖子。等等。
5 peter
2 peter
1 peter
3 helen
2 helen
首先,我们按最近的帖子排序作者。然后,有了这个“评级”,我们按照最近发布的帖子对作者进行排序。
答案 0 :(得分:2)
在线视图中创建计算Min Tm然后加入它。
SELECT f.*
FROM feed f
INNER JOIN (SELECT MAX(TM) MAXTM,
author
FROM Feed
GROUP BY Author)m
ON f.author = m.author
ORDER BY m.MAXTM DESC,
f.author
答案 1 :(得分:1)
您可以尝试这样的事情:
select *
from feed
order by
(select max(tm) from feed f2 where f2.author = feed.author) desc,
tm desc
这首先是作者最近一篇文章的时间,然后是tm。
答案 2 :(得分:1)
SELECT *
FROM `feed`
LEFT JOIN (
SELECT
@rownum:=@rownum+1 AS `rowid`,
`author`,
MAX(`tm`) AS `max_tm`
FROM (SELECT @rownum:=0) r, `feed`
GROUP BY `author`
ORDER BY `max_tm` DESC
) `feedsort` ON(`feed`.`author` = `feedsort`.`author`)
ORDER BY
`feedsort`.`rowid` ASC,
`feed`.`tm` DESC;
这解决了问题,但我确定有更好的解决方案