ActiveTopics - kategori başına Get max 5 başlık

2 Cevap php

Ben birkaç kategori adlı içindeki son 5 aktif konuları almak istiyorum. Her konu bir subcatid vardır ve bu subcatid bir CatID ilgilidir.

Ne istediğiniz her CatID içinde 5 aktif konuları elde etmektir.

Ben aşağıda sorgu kullanmaya çalışıyorum, ama bu hiç çalışmıyor:

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

Bu kodu çalıştırırken ben row_number için (1) hep aynı numarayı almak, bu yüzden bu istediğim sonucu değildir.

Herkes bu işi nasıl alabilirim biliyor mu?

Teşekkürler!

2 Cevap

Ne istediğinizi yakın bir şey dönerse, o zaman için diğer gerekli sütunları ekleyebilirsiniz, bu basitleştirilmiş sorguyu deneyin:

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

Ben MySQL sadece 2 tablolar ile benzer bir şey denedim, ve bazı çok garip sonuçlar var. (Ben size ulaşmak için çalışıyoruz ne yorumlamak eğer, en azından) Her şeyden önce, sorguda değişken atamaları yanlış.

Bunun için ilk önce değiştirin:

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

ile

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

But the weird thing is that if you run the query ileout any filtering on row_number, you get the expected result (ie. you get a row_number per forum category). But when adding the having restriction you will note that the row_number will suddenly jump by 2 (ie row_number will be 1,3,5 instead of 1,2,3 if you have 3 categories). You can get the expected results by using having row_number < 10 instead of your having row_number <= 5.

btw Windows üzerinde MySQL 5.0.51b bu garip davranışları var ve ben sadece Ubuntu üzerinde MySQL 5.1.41 de aynı var, bu yüzden bir hata var sanırım ...

Oh, btw sorgunun geri kalanı (siz ... gibi tüm MAX (...) düşmesi gerekir) yanlış olmalı, ve ceteras @ doğru, daha iyi, sadece başlangıç ​​ve birlikte gitmek gibi sorgu uzatmak istiyorum. Ben kaydetti garip şey görünüşe maddesinin (rakam gitmek) bir ORDER BY ekleyerek çözülebilir.