278

MySQL テーブルを 2 つの列でソートするにはどうすればよいですか?

私が欲しいのは、最初に最高の評価、次に最新の日付でソートされた記事です。例として、これはサンプル出力になります (左の # は評価、次に記事のタイトル、次に記事の日付)

+================+============================+== ============+
| | 記事の評価 | 記事 | 記事の時間 |
+================+============================+== ============+
| | 50 | この記事は素晴らしいです | 2009 年 2 月 4 日 |
+------------+---------------------------------+-- ------------+
| | 35 | この記事はかなり良いです | 2009 年 2 月 1 日 |
+------------+---------------------------------+-- ------------+
| | 5 | この記事はそれほどホットではありません | 2009 年 1 月 25 日 |
+================+============================+== ============+

私が使用している関連するSQLは次のとおりです。

ORDER BY article_rating, article_time DESC

どちらかで並べ替えることはできますが、両方ではできません。

4

5 に答える 5

573

デフォルトの並べ替えは昇順です。両方の注文にキーワード DESC を追加する必要があります。

ORDER BY article_rating DESC, article_time DESC
于 2009-02-05T07:51:35.883 に答える
41
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.
于 2009-02-05T07:55:05.580 に答える
18
ORDER BY article_rating ASC , article_time DESC

DESC最後に、両方の列を降順で並べ替えます。ASCそれ以外の場合は指定する必要があります

于 2009-02-05T07:54:07.330 に答える
8

これは、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
于 2012-04-20T09:19:12.103 に答える