2010-05-20 64 views
0

我想獲得幾個類別中的5個最新活動主題。每個主題都有一個subcatid,而這個subcatid與catid有關。Activetopics - 每個類別獲取最多5個主題

我想要的是獲得每個catid中的5個活動主題。

我嘗試使用下面的查詢,但這不工作:

set @num := 0, @catid := 0; 

       SELECT 
        forum_posts.topicid, 
        forum_topics.titel, 
        forum_topics.sticky, 
        forum_topics.gesloten, 
        MAX(forum_cats.id) AS catid, 
        MAX(forum_cats.titel) AS cattitel, 
        MAX(forum_subcats.id) AS subcatid, 
        MAX(forum_posts.id) AS maxid, 
        DATE_FORMAT(MAX(forum_posts.datum), '%d-%m-%Y om %H:%i uur') AS datum, 
        UNIX_TIMESTAMP(MAX(forum_posts.datum)) AS laatstereactieunix, 
        (COUNT(forum_posts.id) - 1) AS reactieaantal, 

        @num := IF(@catid = MAX(forum_cats.id), @num + 1, 1) AS row_number, 
        @catid := MAX(forum_cats.id) AS dummy 
       FROM 
        forum_posts 
       INNER JOIN 
        forum_topics 
       ON 
        forum_topics.id = forum_posts.topicid 
       INNER JOIN 
        forum_subcats 
       ON 
        forum_subcats.id = forum_topics.subcat 
       INNER JOIN 
        forum_cats 
       ON 
        forum_cats.id = forum_subcats.cat 
       WHERE 
        forum_cats.id IN (1) 
       AND 
        forum_topics.gesloten != '1' 
       GROUP BY 
        forum_posts.topicid, 
        forum_topics.titel, 
        forum_topics.sticky, 
        forum_topics.gesloten 
       HAVING 
        row_number <= 5     
       ORDER BY 
        forum_cats.id ASC, 
        MAX(forum_posts.datum) DESC 

執行此代碼時我總是得到相同數量(1)ROW_NUMBER,所以這不是我想要的結果。

有誰知道我怎麼能得到這份工作?

謝謝!

回答

0

試試這個簡單的查詢,如果返回了接近你想要的東西,那麼你可以添加其他需要的列到它:

set @num := 0, @id := 0; 
SELECT 
    forum_cats.id 
    forum_topics.id, 
    @id:=if(@id > forum_topics.id, @id, forum_topics.id) , -- the latest forum_topics.id for each category 
    @num := IF(@id = forum_topics.id, 1, @num + 1) AS row_number 
FROM 
    forum_posts 
INNER JOIN 
    forum_topics 
ON 
    forum_topics.id = forum_posts.topicid 
INNER JOIN 
    forum_subcats 
ON 
    forum_subcats.id = forum_topics.subcat 
INNER JOIN 
    forum_cats 
ON 
    forum_cats.id = forum_subcats.cat 
WHERE 
    forum_cats.id IN (1,3,5) 
AND 
    forum_topics.gesloten != '1' 
GROUP BY 
    forum_cats.id, 
    forum_topics.id 
ORDER BY 
    forum_cats.id ASC, 
    MAX(forum_posts.datum) DESC 
0

我在MySQL試過類似的東西只有2桌,並獲得一些非常奇怪的結果。首先,你在查詢中的變量賦值是錯誤的(至少,如果我解釋你試圖達到的目標)。

所以先更換:

@num := IF(@catid = MAX(forum_cats.id), @num + 1, 1) AS row_number, 
@catid := MAX(forum_cats.id) AS dummy 

@num := IF(@catid = forum_cats.id, @num + 1, 1) AS row_number, 
@catid := forum_cats.id AS dummy 

但奇怪的是,如果你沒有在ROW_NUMBER任何過濾運行查詢,你會得到預期的結果(即你。每個論壇類別的row_number)。但是當添加有限制時,您會注意到row_number會突然跳躍2(即如果您有3個類別,則row_number將是1,3,5而不是1,2,3)。您可以通過使用having row_number < 10而不是您的having row_number <= 5來獲得預期結果。

BTW我在MySQL 5.0.51b這種怪異的行爲在Windows和我剛剛在Ubuntu上的MySQL 5.1.41一樣的,所以我想這是一個錯誤......

哦,順便說一句的其餘你的查詢必須是錯誤的(你應該把所有的MAX(...)作爲...),並且@ceteras是正確的,你最好簡單地開始並且在你繼續的時候擴展查詢。我注意到的奇怪的東西顯然可以通過添加一個ORDER BY子句來解決(去圖)。

相關問題