4

一連の ID についてデータベースにクエリを実行すると、mysql は ID が指定された順序で結果を提供しません。私が使用しているクエリは次のとおりです。

SELECT id ,title, date FROM Table WHERE id in (7,1,5,9,3)

代わりに、提供される結果は 1、3、5、7、9 の順序になります。

この自動ソートを回避するにはどうすればよいですか

4

4 に答える 4

10

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')
于 2010-11-16T15:24:35.943 に答える
3

自動ソートやデフォルトのソートは行われません。表示されている並べ替えは、テーブル内の行の自然な並べ替えである可能性が最も高いです。それらが挿入された順序。結果を他の方法でソートする場合は、ORDER BY句を使用して指定します。INSQL では、ソート順が句内の項目の順序に従うように指定する方法はありません。

于 2010-11-16T15:21:34.167 に答える
0

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;
于 2010-11-16T15:29:44.633 に答える
0

表示されている動作は、クエリの最適化の結果です。IN ステートメントがインデックスを使用して最も効率的な方法でレコードを返すように、id にインデックスがあると思います。ORDER BY ステートメントが指定されていないため、データベースは返されるレコードの順序は重要ではないと想定し、速度を最適化します。(チェックアウト「EXPLAIN SELECT」)

CodeAddicts または Spudley の回答で、必要な結果が得られます。別の方法として、「mytable」(または別のテーブル) の ID に優先順位を割り当て、これを使用して必要に応じてレコードを並べ替えます。

于 2010-11-16T15:59:17.720 に答える