2010-05-20 4 views
0

Je veux connaître les 5 derniers sujets les plus actifs dans plusieurs catégories. Chaque sujet a un subcatid et ce subcatid se rapporte à un catid.Activetopics - Obtenez un maximum de 5 sujets par catégorie

Ce que je veux, c'est obtenir les 5 sujets actifs dans chaque catid.

J'essaie d'utiliser la requête ci-dessous, mais cela ne fonctionne pas du tout:

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 

Lors de l'exécution de ce code, je reçois toujours le même numéro (1) pour row_number, il en est ainsi pas le résultat que je veux.

Est-ce que quelqu'un sait comment je peux obtenir ce travail?

Merci!

Répondre

0

Essayez cette requête simplifiée, si elle retourne quelque chose proche de ce que vous voulez, vous pouvez ajouter les autres colonnes nécessaires pour lui:

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

J'ai essayé quelque chose de similaire avec seulement deux tables dans MySQL, et a obtenu des résultats très étranges. Tout d'abord, vos affectations de variables dans la requête sont fausses (au moins, si j'interprète ce que vous essayez d'atteindre).

Alors d'abord remplacer:

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

avec

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

Mais la chose étrange est que si vous exécutez la requête sans filtrage sur row_number, vous obtenez le résultat escompté (c.-à-vous. un row_number par catégorie de forum). Mais quand vous ajoutez la restriction ayant, vous remarquerez que le numéro de ligne va soudainement sauter de 2 (c'est-à-dire que row_number sera 1,3,5 au lieu de 1,2,3 si vous avez 3 catégories). Vous pouvez obtenir les résultats attendus en utilisant having row_number < 10 au lieu de votre having row_number <= 5.

BTW j'ai eu ce comportement bizarre dans MySQL 5.0.51b sur Windows et je viens de recevoir le même dans MySQL 5.1.41 sur Ubuntu, donc je suppose que c'est un bug ...

Oh, btw le reste votre requête doit être fausse (vous devez supprimer tout le MAX (...) comme ...), et @ceteras a raison, vous devriez commencer simplement et étendre la requête au fur et à mesure. La chose étrange que j'ai noté peut apparemment être résolue en ajoutant une clause ORDER BY (allez figure).

Questions connexes