2010-09-13 5 views
0

Ma requête:Comment faire fonctionner cette requête Mysql?

SELECT * 
FROM forum_topics 
WHERE cat_id IN(1,2,3,4,5,6,7) 
ORDER BY last_message DESC 
LIMIT 7 

Je veux obtenir le plus grand et une seule valeur de chaque cat_id (7 valeurs au total). Comment corriger cette requête pour la faire fonctionner si c'est possible?

Il y a des sujets de forum et chacun a la valeur last_message et je veux obtenir l'heure du message du dernier sujet. J'espère que c'est clair.

Merci

Répondre

1

MySQL ne prend pas en charge la fonction d'analyse, qui est ce que vous êtes vraiment après:

SELECT x.* 
    FROM (SELECT ft.*, 
       CASE 
        WHEN @cat_id = ft.cat_id THEN @rownum := @rownum + 1 
        ELSE @rownum := 1 
       END AS rank, 
       @cat_id = ft.cat_id 
      FROM FORUM_TOPICS ft 
      JOIN (SELECT @rownum := 0, @cat_id := -1) r 
     ORDER BY ft.cat_id, ft.last_message DESC) 
WHERE x.rank = 1 

Cela fournira une colonne calculée appelée « rang », où la dernière ligne basée sur la colonne last_message aura la valeur "1" par la valeur cat_id. La requête externe ne reçoit que les enregistrements dont la valeur est un rang ...

+1

Cette requête est moche comme l'enfer:/ –

+1

@hey : Blâmez MySQL de ne pas encore supporter les fonctions analytiques. Jusque-là, s'attendre à des hacks comme ceux-ci. En outre, vous ne devriez pas utiliser 'SELECT *' - parce que je ne connaissais pas les colonnes de FORUM_TOPICS, vous les obtiendriez toutes ... plus le 'rank' et la colonne pour assigner la valeur cat_id dans la sortie. –

+0

oK, tHanks .. –

0

Votre question est un peu confus, mais je pense que vous êtes à la recherche pour cela.

SELECT * FROM forum_topics WHERE cat_id IN(1,2,3,4,5,6,7) group by cat_id order by max(last_message) LIMIT 7 
0

ajouter un groupe par clause comme GROUP BY cat_id

Ainsi, votre requête deviendra SELECT * FROM forum_topics WHERE cat_id IN(1,2,3,4,5,6,7) GROUP BY cat_id ORDER BY last_message DESC LIMIT 7

Questions connexes