按字段排序或不带 IN() 的 Find_in_set

Order by Field or Find_in_set without IN()

我正在为搜索功能构建一个 MySQL 查询,现在我想使用 ID 数组以某种方式对结果进行排序。

我已经能够通过使用类似于此的 MySQL 来做到这一点:

SELECT id, name
FROM mytable 
WHERE id IN (77, 3, 123, 1) 
ORDER BY FIELD(id, 77, 3, 123, 1)

但我想知道是否可以 Order by FIELDFIND_IN_SET 而无需在 Select 查询中设置 IN()

我不想使用 IN() 语句,因为我还希望得到不在 ID 数组中的结果

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

SELECT id, name
FROM mytable 
ORDER BY id NOT IN (77, 3, 123, 1),
         FIELD(id, 77, 3, 123, 1)

如果您只喜欢一次评价,您可以在 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

这可能会更快,具体取决于数组的大小,但您必须对其进行测试,它也可能更糟。