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が、1人の著者の行がくっつくようにします。

たとえば、

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の投稿はすべて最初に表示されます。次の行セットは、2 番目に新しい投稿から始まる必要があります。等々。author

5 peter
2 peter
1 peter
3 helen
2 helen

まず、作成者を最近の投稿で降順に並べ替えます。次に、この「評価」を使用して、最近の投稿でソートされた作成者でフィードをソートします。

4

3 に答える 3

2

最小 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 に答える