我正在为搜索功能构建一个mysql查询,现在我想使用ID数组以某种方式对结果进行排序。
我已经能够通过使用类似于此的MYSQL来实现这一目标:
SELECT id, name
FROM mytable
WHERE id IN (77, 3, 123, 1)
ORDER BY FIELD(id, 77, 3, 123, 1)
但我想知道,如果不在Select查询中设置Order by FIELD
,FIND_IN_SET
或IN()
是否可行。
我不想使用IN()语句,因为我也期望ID不在数组
中的结果希望有人能把我推向正确的方向,
提前致谢,
答案 0 :(得分:2)
SELECT id, name
FROM mytable
ORDER BY id NOT IN (77, 3, 123, 1),
FIELD(id, 77, 3, 123, 1)
答案 1 :(得分:2)
如果您只想进行一次评估,则可以在field()
中撤消订单并使用
SELECT id, name
FROM mytable
ORDER BY FIELD(id, 1, 123, 3, 77) desc
它仍然需要比原始查询花费更多的时间,因为field()
比IN
更贵,现在您必须为每一行评估field()
而不是仅仅评估一些行
替代方案可能是使用
SELECT id, name, FIELD(id, 77, 3, 123, 1) as orderno
FROM mytable
WHERE id IN (77, 3, 123, 1)
union
SELECT id, name, 99999999
FROM mytable
WHERE id NOT IN (77, 3, 123, 1)
order by orderno, id
这可能会更快,具体取决于您的阵列的大小,但您必须测试它,它可能会更糟。