一連の ID についてデータベースにクエリを実行すると、mysql は ID が指定された順序で結果を提供しません。私が使用しているクエリは次のとおりです。
SELECT id ,title, date FROM Table WHERE id in (7,1,5,9,3)
代わりに、提供される結果は 1、3、5、7、9 の順序になります。
この自動ソートを回避するにはどうすればよいですか
一連の ID についてデータベースにクエリを実行すると、mysql は ID が指定された順序で結果を提供しません。私が使用しているクエリは次のとおりです。
SELECT id ,title, date FROM Table WHERE id in (7,1,5,9,3)
代わりに、提供される結果は 1、3、5、7、9 の順序になります。
この自動ソートを回避するにはどうすればよいですか
id
で指定された順序で結果を並べ替えたい場合は、次のin clause
ように使用できますFIND_IN_SET
。
SELECT id ,title, date
FROM Table
WHERE id in (7,1,5,9,3)
ORDER BY FIND_IN_SET(id,'7,1,5,9,3')
自動ソートやデフォルトのソートは行われません。表示されている並べ替えは、テーブル内の行の自然な並べ替えである可能性が最も高いです。それらが挿入された順序。結果を他の方法でソートする場合は、ORDER BY
句を使用して指定します。IN
SQL では、ソート順が句内の項目の順序に従うように指定する方法はありません。
SQLのWHERE
句はソート順には影響しません。ORDER BY
句はそれを行います。
を使用して並べ替え順序を指定しない場合ORDER BY
、SQL は独自の順序を選択します。これは通常、主キーの順序になりますが、何でもかまいません。
レコードを特定の順序で並べたい場合は、必要なORDER BY
順序を SQL に伝える句を指定する必要があります。
必要な順序がその奇数の ID シーケンスのみに基づいている場合は、それをORDER BY
句で指定する必要があります。それを正確に指定するのは難しいでしょう。可能ですが、厄介な SQL コードが必要になり、クエリが大幅に遅くなります (キーを使用してレコードを検索しなくなるため)。
必要な ID シーケンスが、より予測可能な他の要因によるものである場合 (たとえば、実際にレコードをアルファベット順に並べたい場合など)、ORDER BY name
そのまま (またはフィールドが何であれ) 実行できます。
任意の順序で ID で並べ替えたい場合は、並べ替えに使用できる一時フィールドを生成する必要がある場合があります。
SELECT *,
CASE id
WHEN 7 THEN 1
WHEN 1 THEN 2
WHEN 5 THEN 3
WHEN 3 THEN 4
WHEN 9 THEN 5
END AS mysortorder
FROM mytable
WHERE id in (7,1,5,9,3)
ORDER BY mysortorder;
表示されている動作は、クエリの最適化の結果です。IN ステートメントがインデックスを使用して最も効率的な方法でレコードを返すように、id にインデックスがあると思います。ORDER BY ステートメントが指定されていないため、データベースは返されるレコードの順序は重要ではないと想定し、速度を最適化します。(チェックアウト「EXPLAIN SELECT」)
CodeAddicts または Spudley の回答で、必要な結果が得られます。別の方法として、「mytable」(または別のテーブル) の ID に優先順位を割り当て、これを使用して必要に応じてレコードを並べ替えます。