8

IN クエリの値で並べ替えることができますか?

次のデフォルトは「item_idを最小に並べる」ですが、実際には入力どおりにソートしたいのですが...これは可能ですか?

例えば

select item_id, item_title, item_source from items where item_id IN ('1676','1559','1672')

戻りたい:

item_id     item_title    item_source
-------     ----------    -----------
1676        item_a        source_a
1559        item_f        source_f
1672        item_c        source_c
4

3 に答える 3

7

次のようJOINに述語でこれらの値を指定できます。IN

SELECT 
  i.item_id,
  i.item_title
  i.item_source
FROM items i
INNER JOIN
(
   SELECT 0 sortid, 1676 id
   UNION ALL
   SELECT 1,        1559 
   UNION ALL
   SELECT 2,        1672
) t ON i.item_id = t.id
ORDER BY t.sortid

SQL フィドルのデモ

于 2012-11-04T20:33:42.323 に答える
6

ORDER BY CASE可能な値のそれぞれにソートランクを適用するカスタムが必要になります。セットのサイズが大きくなると、明らかにこれは難しくなります。

select
  item_id, 
  item_title, 
  item_source 
from items
where item_id IN ('1676','1559','1672')
/* Custom ORDER BY applies lower order numbers to the lowest value, etc... */
ORDER BY 
  CASE 
    WHEN item_id = 1676 THEN 0
    WHEN item_id = 1559 THEN 1
    WHEN item_id = 1672 THEN 2
    /* If you had others (which you don't because they're limited by the IN() clause, include an ELSE */
    ELSE 99
  END,
  /* Then complete the ORDER BY with other cols to order on as needed... */
  item_source
于 2012-11-04T20:27:04.507 に答える
4

事前に ID がわかっている場合は、FIND_IN_SETまたは関数を使用して結果を整理することを検討してください。FIELD

SELECT 
    item_id,
    item_title,
    item_source
FROM items
WHERE item_id IN ('1676','1559','1672')
ORDER BY FIELD(item_id, '1676', '1559', '1672')

また

ORDER BY FIND_IN_SET(item_id, '1676,1559,1672')

もちろん、欠点は、ID を 2 回指定していることです。ただし、合理的に機能するソリューションはほとんどそうすると思います。これを回避する唯一の方法は、ソート順フィールドなどを使用することです。

于 2012-11-04T20:59:35.737 に答える