MySQLテーブルを2列でソートする方法
私が欲しいのは、最初に最高の評価、それから最新の日付でソートされた記事です。例として、これは出力例になります(左が評価、次に記事のタイトル、そして記事の日付です)。
50 |この記事は揺れる2009年2月4日 35 |この記事はかなり良いです。 2009年2月1日 5 |この記事はそんなに暑くありません。 2009年1月25日
私が使用している関連SQLは次のとおりです。
ORDER BY article_rating, article_time DESC
どちらか一方でソートできますが、両方ではありません。
デフォルトのソートは昇順です。両方の注文にキーワードDESCを追加する必要があります。
ORDER BY article_rating DESC, article_time DESC
ORDER BY article_rating, article_time DESC
同じ評価の記事が2つある場合にのみ、article_timeでソートされます。あなたの例で私が見ることができるすべてから、これはまさに起こることです。
↓ 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.
しかし、検討してください:
↓ 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
は、両方の列を降順に並べ替えます。それ以外の場合はASC
を指定する必要があります
これは、表を2列で並べ替える方法を探している人のためになるかもしれません。これは、集約ソート機能を使用して2つのソートを組み合わせることを意味します。たとえば、全文検索を使用して記事を取得したり、記事の公開日を調べたりするときに非常に便利です。
これはほんの一例ですが、あなたがその考えをつかむならばあなたは使うべき多くの集約関数を見つけることができます。あなたは2番目よりも1つを好むように列に重みを付けることさえできます。私の機能は両方の種類から極値を取ります、従って最も価値のある行が一番上にあります。
この仕事をするためのもっと簡単な解決策があるなら、申し訳ありませんが、私は何も見つけていません。
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
以下は、両方の列に応じて降順でデータを並べ替えます。
ORDER BY article_rating DESC, article_time DESC