4

私は簡単なクエリを持っています:

SELECT data FROM table WHERE id IN (5, 2, 8, 1, 10)

質問は、どうすればデータを選択してINのように注文できるかということです。

順序は5、2、8、1、10でなければなりません。

問題は、注文の鍵がないことです。INデータは他のクエリ(1)からのものですが、安全に注文する必要があります。

解決策はありますか?

(1)

SELECT login 
FROM posts 
    LEFT JOIN users ON posts.post_id=users.id 
WHERE posts.post_n IN (
    2280219,2372244, 2345146, 2374106, 2375952, 2375320, 2371611, 2360673, 2339976, 2331440, 2279494, 2329266, 2271919, 1672114, 2301856
)

助けてくれてありがとう、解決策は機能しますが非常に遅いです、多分後でもっと良いものを見つけるでしょう、とにかく感謝します

4

5 に答える 5

1

http://sqlfiddle.com/#!2/40b299/6

それがあなたが探しているものだと思います:Dあなた自身の状況にそれを適応させてください。

于 2013-03-17T01:55:22.673 に答える
1

任意のリストで並べ替えることができる唯一の方法はORDER BY、そのリストの各アイテムと比較することです。それは醜いですが、それは動作します。選択を行っているコードを並べ替えた方がよい場合があります。

SELECT data FROM t1 WHERE id IN (5, 2, 8, 1, 10)
ORDER BY id = 10, id = 1, id = 8, id = 2, id = 5

そうしないとDESC、各条件に追加する必要があるため、順序が逆になります。

于 2013-03-17T01:03:24.470 に答える
1

CASEステートメントを使用できます

SELECT data 
FROM table WHERE id IN (5, 2, 8, 1, 10)
ORDER BY CASE WHEN id = 5 THEN 1 WHEN id = 2 THEN 2 WHEN id = 8 THEN 3 WHEN id = 1 THEN 4 WHEN id = 10 THEN 5 END
于 2013-03-17T01:06:34.907 に答える
1
SELECT data FROM table
  WHERE id IN (5, 2, 8, 1, 10)
  ORDER BY FIELD (id, 5, 2, 8, 1, 10)

http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_field

CASE または ID=x、ID=y の数を使用して提案された他のソリューションよりも、自動生成が簡単な場合があります (基本的には、必要な ID を同じ順序でコンマ区切りでもう一度挿入するだけでよいため)。

于 2013-03-17T01:32:01.147 に答える
0

これを動的に、MySql 内で行うには、次のことをお勧めします。

  1. 2 つの列を持つ一時テーブルまたはテーブル変数を作成します (MySql にこれらがあるかどうかはわかりません)。
OrderID mediumint not null auto_increment
InValue mediumint -(or whatever type it is)
  1. IN 句の値を順番に挿入します。これにより、挿入順に ID が生成されます。

  2. JOINこの一時テーブルのクエリにa を追加します

  3. 注文方法を次のように変更します

order by TempTable.OrderID
  1. 一時テーブルを削除します (ここでも、ストアド プロシージャ内の SQL では、これは自動的に行われます。MySql については不明なので、完全な開示のためにここで言及します)

これにより、テーブルで注文するキーがないという問題が効果的に回避されます...作成します。動作するはずです。

于 2013-03-17T01:20:38.763 に答える