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

标签 mysql arrays 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)

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

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

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

最佳答案

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

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

关于mysql - 按字段排序或不带 IN() 的 Find_in_set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38680030/

相关文章:

JavaScript Array join() 导致结果中出现空 (%00) 字符

MySQL 通过 FIND_IN_SET 使用分隔符进行多重连接

mysql - 连接 2 个表时如何避免重复的用户名

Mysql:如何正确生成当前一组数字上不存在的唯一10位随机数

mysql - 表中的新行包含其他表中的一些(但不是全部)信息

c# - 您的 SQL 语法有错误

mysql - 从表中选择多个 ID

其他聚合函数中的MySQL聚合函数

c - 项目 : Body Scanner, ACM 1993

c# - 从字符串数组中删除重复字母的字符串