Commander une table MySQL en deux colonnes

228

Comment trier une table MySQL sur deux colonnes?

Ce que je veux, ce sont des articles triés par les notes les plus élevées d'abord, puis par date la plus récente. À titre d'exemple, ce serait un exemple de sortie (# gauche est la note, puis le titre de l'article, puis la date de l'article)

50 | Cet article est génial | 4 févr.2009
35 | Cet article est assez bon | 1 févr.2009
5 | Cet article n'est pas si chaud | 25 janv.2009

Le SQL pertinent que j'utilise est:

ORDER BY article_rating, article_time DESC

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

billynoah
la source

Réponses:

480

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
truppo
la source
Impair. Quand j'ai deux colonnes, le nom et le total et que je veux classer par ordre alphabétique par nom et DESC par total, alors je vois seulement, qu'il a été commandé par nom, mais pas par total
Eugene
J'ai piraté avec (-1) * field1, field2 sans raison sur des champs numériques ... merci.
Asad Hasan
hahaha .... not est une bonne requête, car si vous essayez, vous ne pourrez jamais réorganiser la catégorie de valeurs "vide" ... nice try en 2009 .. mais en 2015 ne fonctionne pas correctement;), le correct est "3 Sous-requête "ou" 2 "
livrée le
Une telle requête ne fonctionne pas dans mon cas .. Dans ce cas, je ne reçois pas de tri pour la ville, sélectionnez la ville distincte, le pays à partir de la commande des clients par pays desc, desc ville;
Pra_A
4
Je ne sais pas pourquoi cela est vérifié comme réponse, mais ce n'est pas le cas. Il trie par la première colonne puis la deuxième mais pas les deux en même temps.
aidonsnous
34
ORDER BY article_rating, article_time DESC

ne triera par article_time que s'il y a deux articles avec la même note. 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.
Tomalak
la source
Cette réponse m'a aidé.Merci @Tomalak
Jayani Sumudini
12
ORDER BY article_rating ASC , article_time DESC

DESCà la fin sera trié par les deux colonnes décroissantes. Vous devez spécifier ASCsi vous le souhaitez autrement

Apprentissage
la source
8

Cela peut peut-être aider quelqu'un qui cherche le moyen de trier le tableau sur deux colonnes, mais de manière parallèle. Cela signifie combiner deux tris à l'aide de la fonction de tri agrégé. Il est très utile, par exemple, pour récupérer des articles à l'aide de la recherche en texte intégral et également concernant la date de publication de l'article.

Ce n'est qu'un exemple, mais si vous saisissez 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 à la seconde. La fonction de la mienne prend des extrêmes des deux sortes, donc 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 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
Jiri Fornous
la source
34
oh mon dieu pourquoi publiez-vous un tel code pour une question aussi simple.
Ben Sinclair
4

Les éléments suivants classeront vos données en fonction des deux colonnes dans l'ordre décroissant.

ORDER BY article_rating DESC, article_time DESC
Ivan
la source
3
Comment une copie de la réponse acceptée 4 ans plus tard reçoit-elle autant de votes positifs?
Stack Underflow
peut être à cause de l'explication: P
Rizwan Haider