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ページ目にいるとき、ソートがすでに変更されていても正しいレコードを取り出すと思った。
これを行う他の方法はありますか?
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() 関数を使用します。したがって、実際には、指定されたセットのフィールド値のインデックスであるこの関数の戻り値で結果セットをソートします。
これにはCASE
を使用できるはずです。
ORDER BY CASE id
WHEN 1 THEN 1
WHEN 5 THEN 2
WHEN 4 THEN 3
WHEN 3 THEN 4
ELSE 5
END
ORDER BY に関するmysqlの公式ドキュメントで、誰かがこの問題にFIELD
を次のように使用できると投稿しています。
SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)
これはテストされていないコードで、理論的には機能するはずです。
これを解決する別の方法があります。次のような別のテーブルを追加します。
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
-ステートメントを変更する必要はありません。注文テーブルのデータを変更するだけです。
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
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC