MySQLテーブルを2列で注文する


228

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

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

50 | この記事は揺れる| 2009年2月4日
35 | この記事はかなり良いです| 2009年2月1日
5 | この記事はそれほど暑くない| 2009年1月25日

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

ORDER BY article_rating, article_time DESC

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

回答:


480

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

ORDER BY article_rating DESC, article_time DESC

奇数。私は2つのカラム名と合計を持っており、合計で名前とDESCのアルファベット順に注文したい場合は、その後、私はそれが名前によって命じられたことを、唯一見るではなく、合計することによって
ユージン

私は(-1)* field1、field2を使って、数値フィールドを理由もなくハッキングしていた...ありがとう。
アサドハサン2014年

hahaha ....良いクエリではありません。試した場合、「空の」値のカテゴリを並べ替えることはできません。 "または" 2 "
サブクエリ

この場合、このようなクエリは機能しません。この場合、Cityで、国の説明、都市の説明で顧客の注文から個別の都市、国を選択するための並べ替えが行われません。
Pra_A 2016

4
なぜこれが回答としてチェックされるのかはわかりませんが、まだチェックされていません。最初の列、次に2番目の列の順に並べ替えますが、同時に両方は並べ替えません。
aidonsnous

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

この回答は役に立ちました。ありがとう@Tomalak
Jayani Sumudini 2018

12
ORDER BY article_rating ASC , article_time DESC

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


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

34
どうしてそんな単純な質問にそのようなコードを投稿するのですか。
Ben Sinclair

4

以下は、両方の列に応じてデータを降順で並べ替えます。

ORDER BY article_rating DESC, article_time DESC

3
4年後、承認された回答のコピーはどのようにしてこの多くの賛成票を受け取りますか?
スタックアンダーフロー

説明のせいかもしれません:P
ハイダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.