2012-05-10 17 views
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進行排序,但所有彼得帖子先走了,因爲他的職位是最近的一次。下一組行應該來自author以及最近的第二篇文章。等等。

5 peter 
2 peter 
1 peter 
3 helen 
2 helen 

首先我們根據最近發佈的作者排序,降序排列。然後,通過這個「評級」,我們按照最近發佈的帖子對作者進行排序。

回答

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

+0

這隻能移動一個作家了。而其他人呢? :) – kolypto

+0

@o_OTync我不確定你的意思。 DEMO匹配[你的答案](http://sqlfiddle.com/#!2/70d9a/6) –

+0

Ehm中的查詢輸出和輸出,當然,你是對的! Thatnks :) – kolypto

1

你可以嘗試這樣的事:

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

這首先排序由最近的帖子作者的時間,然後通過TM。

1
SELECT * 
FROM `feed` 
    LEFT JOIN (
     SELECT 
      @rownum:[email protected]+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; 

這解決了問題,但我敢肯定有一個更好的解決方案