54 votes

PHP MySQL Commande par deux colonnes

J'essaie de trier des données sur deux colonnes, mais cela ne semble pas fonctionner. Ce que je veux, ce sont des articles triés d'abord par les notes les plus élevées, puis par la date la plus récente. Voici un exemple de résultat (le numéro de gauche est l'évaluation, puis le titre de l'article, puis la date de l'article)

50 | This article rocks          | Feb 4, 2009
35 | This article is pretty good | Feb 1, 2009
5  | This Article isn't so hot   | Jan 25, 2009

Le SQL pertinent que j'utilise est :

ORDER BY article_rating, article_time DESC

Il semble que le tri se fasse par article_time DESC. Je peux trier par l'un ou l'autre, mais pas par les deux, est-ce que je rate quelque chose d'évident ?

126voto

truppo Points 10346

Le tri par défaut est ascendant, vous devez ajouter le mot clé DESC à vos deux commandes :

ORDER BY article_rating DESC, article_time DESC

8voto

Tomalak Points 150423
ORDER BY article_rating, article_time DESC

ne triera par article_time que s'il y a deux articles avec le même classement. D'après ce que je peux voir dans votre exemple, c'est exactement ce qui se passe.

↓ primary sort                         secondary sort ↓
1.  50 | This article rocks          | Feb 4, 2009    3.
2.  35 | This article is pretty good | Feb 1, 2009    2.
3.  5  | This Article isn't so hot   | Jan 25, 2009   1.

mais considérez :

↓ primary sort                         secondary sort ↓
1.  50 | This article rocks          | Feb 2, 2009    3.
1.  50 | This article rocks, too     | Feb 4, 2009    4.
2.  35 | This article is pretty good | Feb 1, 2009    2.
3.  5  | This Article isn't so hot   | Jan 25, 2009   1.

4voto

Jiri Fornous Points 101

Cela peut aider quelqu'un qui cherche le moyen de trier un tableau par deux colonnes, mais de manière parallèle. Cela signifie qu'il faut combiner deux tris en utilisant la fonction de tri agrégé. C'est très utile, par exemple, pour retrouver des articles en utilisant la recherche plein texte et aussi pour connaître la date de publication de l'article.

Ce n'est qu'un exemple, mais si vous saisissez l'idée, vous pouvez trouver de nombreuses fonctions d'agrégation à utiliser. Vous pouvez même pondérer les colonnes pour en préférer une à la seconde. La fonction que j'utilise prend les extrêmes des deux sortes, ainsi les lignes les plus valorisées sont en haut.

Désolé s'il existe des solutions plus simples pour faire ce travail, mais je n'en ai pas trouvé.

SELECT
 `id`,
 `text`,
 `date`
 FROM
   (
   SELECT
     k.`id`,
     k.`text`,
     k.`date`,
     k.`match_order_id`,
     @row := @row + 1 as `date_order_id`
     FROM
     (
       SELECT
         t.`id`,
         t.`text`,
         t.`date`,
         @row := @row + 1 as `match_order_id`
         FROM
         (
           SELECT
             `art_id` AS `id`,
             `text`   AS `text`,
             `date`   AS `date`,
             MATCH (`text`) AGAINST (:string) AS `match`
             FROM int_art_fulltext
             WHERE MATCH (`text`) AGAINST (:string IN BOOLEAN MODE)
             LIMIT 0,101
         ) t,
         (
           SELECT @row := 0
         ) r
         ORDER BY `match` DESC
     ) k,
     (
       SELECT @row := 0
     ) l
     ORDER BY k.`date` DESC
   ) s
 ORDER BY (1/`match_order_id`+1/`date_order_id`) DESC

3voto

Learning Points 5386

ORDER BY article_rating ASC , article_time DESC

DESC à la fin permettra de trier les deux colonnes en ordre décroissant. Vous devez spécifier ASC s'il est autrement

1voto

NonZero Points 96

ORDER BY article_rating desc,article_time DESC

Cela permettra d'ordonner vos données en fonction des deux colonnes par ordre décroissant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X