没有IN()的字段或Find_in_set的MYSQL排序

时间:2016-07-31 01:46:54

标签: mysql arrays mysqli find-in-set

我正在为搜索功能构建一个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 FIELDFIND_IN_SETIN()是否可行。

我不想使用IN()语句,因为我也期望ID不在数组

中的结果

希望有人能把我推向正确的方向,

提前致谢,

2 个答案:

答案 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

这可能会更快,具体取决于您的阵列的大小,但您必须测试它,它可能会更糟。