2016-07-31 164 views
1

我正在为搜索功能建立一个mysql查询,现在我想以某种方式使用ID数组来排列结果。MYSQL按字段排序或Find_in_set无IN()

我已经能够做到这一点,通过使用类似这样一块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没有选择查询中设置IN()

我不想使用IN()语句,因为我也希望结果不是数组中ID的

希望有人可以把我在正确的方向,在

谢谢事先,

回答

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 

这可以更快取决于您的数组的大小,但你将不得不测试它,它也可能会更糟。

+0

你应该使用'UNION ALL',因为这两个选择肯定有一个空的交点。 –

+0

第一种方法对我最有效,它比NOT IN查询快了几毫秒,但一切都很重要:P 感谢您的回答和解释! – Lennart

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

需要说明。学习[回答]。 –

+0

这对我来说看起来不错:) – Jordon

+0

这很好,但不幸的是,它将长查询的加载时间增加了一秒或更多。 你也许知道任何其他方式来完成这可能会更快? – Lennart