2017-05-30 3 views
1

私のようなクエリがある:カスタムオーダーは

SELECT * 
FROM table1 
WHERE (table1.first_key, table1.second_key) IN ((2, 1), (1, 1), (2, 2)); 

私は結果が欲しい、それIN(...)コンテンツの順。

それは1列のみだった場合、私が使用している可能性:

ORDER BY FIELD(table1.first_key, 1, 5, 4, 7) 

を私は良いMySQLの方法で、複数の列と同じ結果を持ってする方法を見つけ出すません。

は、ここでは動作しますが、巨大なテーブルの上に遅くなり、これまでの私の最高の試みである:

作品
SELECT CONCAT(first_key, "_", second_key) AS string_hack, first_key, second_key,.... 
FROM table1 
WHERE (first_key, second_key) IN ((2, 1), (1, 1), (2, 2)) 
ORDER BY FIELD(string_hack, "2_1", "1_1", "2_2") 

が、それは悪臭を放ちます。

答えて

1

何も速いことになるだろうされていないと、あなたのアプローチは非常に合理的であり、より良い方法があるに違いありません。 string_hackという列を持つ必要はありません。あなただけ行うことができます。

ORDER BY FIELD(CONCAT_WS('_', first_key, second_key), 
       '2_1', '1_1', '2_2; 
      ) 

ます。またJOINへの切り替えを検討してください:

SELECT t1.* 
FROM table1 t1 JOIN 
    (SELECT 1 as ordering, 2 as key1, 1 as key1 UNION ALL 
     SELECT 2, 1, 1 UNION ALL 
     SELECT 3, 2, 2 
    ) keys 
     ON t1.first_key = keys.key1 AND t1.second_key = keys.key2 
ORDER BY keys.ordering; 
+0

興味深いアプローチを。 –

関連する問題