1

我正在为搜索功能构建 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_SET不设置。IN()

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

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

4

2 回答 2

2
SELECT id, name
FROM mytable 
ORDER BY id NOT IN (77, 3, 123, 1),
         FIELD(id, 77, 3, 123, 1)
于 2016-07-31T01:51:21.520 回答
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

根据数组的大小,这可能会更快,但您必须对其进行测试,它可能会更糟。

于 2016-07-31T14:48:38.913 回答