2009-02-05 10 views
156

Comment trier une table MySQL par deux colonnes?PHP MySQL Ordre par deux colonnes

Ce que je veux, ce sont les articles classés par ordre décroissant en premier, puis en date la plus récente. À titre d'exemple, ce serait une sortie de l'échantillon (gauche # est la cote, le titre de l'article, 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 J'utilise est:

ORDER BY article_rating, article_time DESC 

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

Répondre

340

tri par défaut est ascendante, vous devez ajouter le mot-clé à la fois vos DESC commandes:

ORDER BY article_rating DESC, article_time DESC 
+0

Odd. Quand j'ai deux colonnes, le nom et le total et que je veux trier alphabétiquement par nom et DESC par total, alors je vois seulement, qu'il a été ordonné par nom, mais pas par total – Eugene

+0

Je ne savais pas que c'était possible! Exxelent! :) – teecee

+0

Je pirate avec (-1) * field1, field2 sans raison sur les champs numériques ... merci. –

7
ORDER BY article_rating ASC , article_time DESC 

DESC à la fin triera par les deux colonnes descendantes. Vous devez spécifier ASC si vous voulez autrement

20
ORDER BY article_rating, article_time DESC 

triera par article_time que s'il y a deux articles avec la même note. De 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érer:

↓ 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. 
6

Cette aide peut-être quelqu'un qui est à la recherche de la façon de trier le tableau par deux colonnes, mais de manière paralel. Cela signifie combiner deux sortes en utilisant la fonction de tri agrégée. C'est très utile lorsque, par exemple, vous récupérez des articles en utilisant la recherche fulltext et aussi concernant la date de publication de l'article.

Ceci est seulement un exemple, mais si vous voyez l'idée, vous pouvez trouver beaucoup de fonctions agrégées à utiliser. Vous pouvez même peser les colonnes pour en préférer une par seconde. La fonction de la mienne prend des extrêmes des deux sortes, ainsi les rangées les plus appréciées sont sur le dessus. Désolé s'il existe des solutions plus simples pour faire ce travail, mais je n'en ai trouvé aucun.

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 
+18

oh mon dieu pourquoi publiez-vous un tel code pour une question aussi simple. – Andy

2

Ce qui suit va ordonner vos données selon les deux colonnes dans l'ordre décroissant.

ORDER BY article_rating DESC, article_time DESC 
Questions connexes