web-dev-qa-db-ja.com

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

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

PDATE: mysqlの悪用について;-)なぜこれが必要なのかを説明する必要があります...

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

だから、彼が私のサイトに来たら、私はすべてのIDをセッションに入れ、彼が2ページ目にいるとき、ソートがすでに変更されていても正しいレコードを取り出すと思った。

これを行う他の方法はありますか?

79
Jerry2

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

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

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

162
Manjula

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

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

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

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

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

15
Jan Dragsbaek

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

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-ステートメントを変更する必要はありません。注文テーブルのデータを変更するだけです。

5
Bjoern

SELECT * FROMテーブル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

3
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC
1
Hisham shahid