0

我有一个带有时间戳行的表:比如说,一些作者提供的信息:

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第二个最近的帖子。等等。

5 peter
2 peter
1 peter
3 helen
2 helen

首先,我们按最近的帖子对作者进行降序排序。然后,有了这个“评级”,我们按照最近的帖子排序的作者对提要进行排序。

4

3 回答 3

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 

演示

于 2012-05-10T20:52:44.830 回答
1

你可以尝试这样的事情:

select * 
from feed
order by 
  (select max(tm) from feed f2 where f2.author = feed.author) desc, 
  tm desc

这首先按作者最近发表的时间排序,然后按 tm.

于 2012-05-10T20:53:56.813 回答
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;

这解决了问题,但我确信有更好的解决方案

于 2012-05-10T20:55:36.447 回答