web-dev-qa-db-fra.com

Commandez une table MySQL par deux colonnes

Comment trier une table MySQL sur deux colonnes?

Ce que je veux, ce sont des articles triés par priorité, puis par date la plus récente. À titre d’exemple, il s’agirait d’un exemple de sortie (# de gauche est la note, puis le titre de l’article, puis la date de l’article).

 50 | Cet article bascule | 4 février 2009 
 35 | Cet article est très bon | 1er février 2009 
 5 | Cet article n'est pas si chaud | 25 janvier 2009 

Le code SQL que j'utilise est le suivant:

ORDER BY article_rating, article_time DESC

Je peux trier par l'un ou l'autre, mais pas les deux.

208
magenta

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

ORDER BY article_rating DESC, article_time DESC
441
truppo
ORDER BY article_rating, article_time DESC

ne triera par article_time que s’il existe deux articles ayant le même classement. D'après tout 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.
29
Tomalak
ORDER BY article_rating ASC , article_time DESC

DESC à la fin sera trié par ordre décroissant. Vous devez spécifier ASC si vous le souhaitez autrement

11
Learning

Cela aidera peut-être quelqu'un qui cherche le moyen de trier le tableau en deux colonnes, mais de manière parallèle. Cela signifie combiner deux tris en utilisant la fonction de tri agrégé. C'est très utile, par exemple, lors de la récupération d'articles à l'aide de la recherche en texte intégral, ainsi que pour la date de publication de l'article.

Ce n’est qu’un exemple, mais si vous en avez l’idée, vous pouvez trouver beaucoup de fonctions d’agrégation à utiliser. Vous pouvez même pondérer les colonnes pour en préférer une par seconde. La fonction de la mienne prend des extrêmes des deux types, ainsi les lignes les plus précieuses sont sur le dessus.

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

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
8
Jiri Fornous

Ce qui suit va ordonner vos données en fonction de la colonne en ordre décroissant.

ORDER BY article_rating DESC, article_time DESC
4
user1133648