排序以使具有匹配列的行粘在一起

时间:2012-05-10 20:48:20

标签: mysql sorting

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

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

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

3 个答案:

答案 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 

DEMO

答案 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;

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