特定のID値によるMySQLの順序


95

次のように列の値(ID)の定義済みセットを使用して「order by」でmysqlをソートすることは可能ですか?order by(ID = 1,5,4,3)したがって、レコード1、5、4、3を取得します注文する?

更新: mysqlの乱用について;-)私はなぜこれが必要なのか説明しなければなりません...

5分ごとにレコードをランダムに並べ替えたい。私は、テーブルを更新して異なるランダムな並べ替え順序を設定するcronタスクを持っています。問題は1つだけです!ページネーション。私のページにアクセスした訪問者がいて、最初の20件の結果を提供します。彼は6分間待ってから2ページに移動しますが、ソート順がすでに変更されているため、間違った結果になります。

そのため、彼が私のサイトにアクセスした場合、すべてのIDをセッションに入れ、ページ2にいるときは、並べ替えがすでに変更されていても、正しいレコードが出力されると思いました。

これを行うためのより良い方法は他にありますか?


mysqlが特定の順序で注文できない方法があるかどうかを尋ねていますか?
stefgosselin 2011年

1
データモデルが壊れているのどちらか/不完全(ように聞こえるところからこの順来るのでしょうか?)、または代わりに、あなたは、MySQLを乱用しています。
derobert

回答:


202

ORDER BYおよびFIELD関数を使用できます。http://lists.mysql.com/mysql/209784を参照してください

SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)

ドキュメントによれば、Field()関数を使用し、「str1、str2、str3、...リスト内のstrのインデックス(位置)を返します。strが見つからない場合は0を返します」。そのため、実際には、このセットのフィールド値のインデックスであるこの関数の戻り値で結果セットをソートします。


私もこれを使用せずにこれを機能させることができないようです:WHERE ID IN(1,5,4,3)
TV-C-15

None値でこれをどのように使用しますか?
Nono London

30

CASEこれを使用できるはずです:

ORDER BY CASE id
  WHEN 1 THEN 1
  WHEN 5 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END

18

ORDER BYに関するmysqlの公式ドキュメントでFIELD、次のように、この問題に使用できることが誰かから投稿されています。

SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)

これは理論的には機能するテストされていないコードです。


7
SELECT * FROM table ORDER BY id='8' DESC, id='5' DESC, id='4' DESC, id='3' DESC

たとえば、10個のレジストリがある場合、ID 1、5、4、3が最初に表示され、次に他のレジストリが表示されます。

通常の展示会1 2 3 4 5 6 7 8 9 10

このように

8 5 4 3 1 2 6 7 9 10


OKアドバイスありがとう
Bruno Mangini Alves

6

これを解決する別の方法があります。次のような別のテーブルを追加します。

CREATE TABLE `new_order` (
  `my_order` BIGINT(20) UNSIGNED NOT NULL,
  `my_number` BIGINT(20) NOT NULL,
  PRIMARY KEY (`my_order`),
  UNIQUE KEY `my_number` (`my_number`)
) ENGINE=INNODB;

このテーブルを使用して、独自の順序メカニズムを定義します。

そこに値を追加します。

my_order | my_number
---------+----------
       1 |         1
       2 |         5
       3 |         4
       4 |         3

...次に、この新しいテーブルを結合するときにSQLステートメントを変更します。

SELECT *
FROM your_table AS T1
INNER JOIN new_order AS T2 on T1.id = T2.my_number
WHERE ....whatever...
ORDER BY T2.my_order; 

このソリューションは他のソリューションよりも少し複雑ですが、これを使用SELECTすると、注文基準が変更されるたびにステートメントを変更する必要はありません。注文テーブルのデータを変更するだけです。


0
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC

2
それをさらに説明できますか?これは受け入れられた回答に似ていますが、私はそれASC OR DESCが適切な構文であるとは思いません
ニコ・ハーゼ

@NicoHaase ASCとDESCの違いは、ascを使用するとフィールド関数で使用するIDが最後に来て、DESCを使用するとフィールド関数でIDが最初に来る
Hisham shahid

@NicoHaase ASCまたはDESCのいずれかを、要件に応じたクエリで使用できます
Hisham shahid

したがって、1つのクエリで両方を使用することはできません。ニコはあなたがあなたの答えを構文的に正しいように提案することを提案したと思いました。彼がASDとDESCの実際の意味に精通していると確信しています:)
RiggsFolly

0

結果の最初に単一のIDを注文する必要がある場合は、IDを使用します。

select id,name 
from products
order by case when id=5 then -1 else id end

複数のIDのシーケンスで開始する必要がある場合は、INステートメントで使用するのと同様に、コレクションを指定します。

select id,name 
from products
order by case when id in (30,20,10) then -1 else id end,id

さらに説明を追加します
Mathews Sunny

1つのIDのみにorder byを使用する場合は、
最初の

0

結果の最後に1つのIDを注文したい場合は、大文字と小文字による順序を使用します。(例:最後の「その他」オプションとすべての都市リストをアルファベット順に表示したい場合。)

select id,city 
from city
order by case 
when id = 2 then city else -1 
end, city ASC

たとえば5つの都市がある場合、ドロップダウンの最後に「その他」オプションを表示して都市をアルファベット順に表示したい場合は、このクエリを使用できます。テーブルの2番目のid(id:2)に他の例が表示されているので、上記のクエリで「when id = 2」を使用しています。

DBテーブルのレコード:

Bangalore - id:1
Other     - id:2
Mumbai    - id:3
Pune      - id:4
Ambala    - id:5

私の出力:

Ambala  
Bangalore  
Mumbai  
Pune
Other

2
コードに説明を追加してみてください。それにより、答えがより明確で理解しやすくなります。stackoverflow.com/help/how-to-answer
32cupo

1つのIDのみでorder byを使用する場合(例:最後の「その他」オプションが必要で、すべての都市リストがアルファベット順に表示されます。)このクエリを使用できます。それは私のために働いています。
Preeti
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.