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