我有一个类似的查询:
SELECT *
FROM table1
WHERE (table1.first_key, table1.second_key) IN ((2, 1), (1, 1), (2, 2));
我希望结果是IN(....)内容的顺序。
如果它只有一列,我本可以使用:
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")
有效,但很臭。
必须有更好的方法
答案 0 :(得分: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;