2012-09-27 63 views
1

之前,我解釋我的問題,我會很快去了表的結構是怎樣:獲取4個最新行,從同桌

類型:MySQL 帖子/表主題:

int  int**  UNIX Time  Int  Int 
-------------------------------------------------- 
| id | category | postdate | topic_id | is_topic | 
-------------------------------------------------- 
| 1 | a  | 12345678 | 1  |  1 | 
-------------------------------------------------- 
| 2 | a  | 12345678 | 1  |  0 | 
-------------------------------------------------- 
| 3 | b  | 12345678 | 3  |  1 | 
-------------------------------------------------- 
| 4 | b  | 12345678 | 3  |  0 | 
-------------------------------------------------- 
| 5 | c  | 12345678 | 5  |  1 | 
-------------------------------------------------- 
| 6 | c  | 12345678 | 5  |  0 | 
-------------------------------------------------- 

**我正在使用字母製作更容易閱讀表

我想檢索每個類別的4個最新的行,並且我能夠從GROUP BY的每個類別中獲取1個最新的行,但是我不知道如何爲每個類別獲得多個。

我已經試過這樣的事情:

SELECT * 
FROM posts p 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM posts 
    WHERE category = p.category 
    LIMIT 4 
) 

我也試圖與一些在這裏的一些其他的答案在SO提供的其他答案的人的工作,但我似乎並沒有能夠使它們適合我的目的。

我完全迷失在這裏,因爲當涉及到這些更復雜的查詢時,mysql並不是我的強項。

任何幫助或指針在正確的方向將非常感激!

謝謝!

UPDATE:請注意,類別的數量不是靜態的,並且會改變。

回答

2

像這樣的事情可能會做:

select * from 
    (select 
     @rank:=CASE WHEN @ranked <> category THEN 1 ELSE @rank+1 END as rank, 
     id, 
     category, 
     postdate, 
     topic_id, 
     is_topic 
     @ranked:=category 
    from 
      (select @rank := -1) a, 
      (select @ranked :=- -1) b, 
      (select * from posts order by category, postdate desc) c 
    ) ranked_posts 
where ranked_posts.rank <= 4 

基本上這裏發生了什麼,是我想創建一個「排行榜」目前在其他引擎功能(MS SQL來考慮)。

查詢會遍歷所有按類別排列的帖子,postdate並在類別更改時重置排名的每一行都添加一個「排名」數字。像:

rank | category 
1   a  
2   a  
... 
100  a  
1   b 
2   b 
1   c 
2   c 
3   c 

你做內部的「子查詢」模仿表,則只需選擇有秩< = 4行,(你需要的)。如果你需要更多或更少,你可以調整這個數字。

有一點要記住的是,排序是重要的或排名將全部搞砸。類別必須「分組」,因此ORDER BY category,然後按照您的標準postdate desc排序的組。

+0

感謝您的回覆!我會給它一個擺動。 除了使用會話變量(?)這個事實之外,我不太瞭解這個查詢 - 因爲我希望更多地瞭解它的工作原理,我真的很感謝它只是對它做了什麼:)。謝謝一堆! – MrE

+0

肯定是給我幾分鐘。 –

+0

我真的很感激!非常感謝! – MrE