【问题标题】:Order by Field or Find_in_set without IN()按字段或不带 IN() 的 Find_in_set 排序
【发布时间】:2016-07-31 01:46:53
【问题描述】:

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

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

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

但我想知道是否可以在不在 Select 查询中设置 IN() 的情况下使用 Order by FIELDFIND_IN_SET

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

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

【问题讨论】:

    标签: mysql arrays find-in-set


    【解决方案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
    

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

    【讨论】:

    • 你应该使用UNION ALL,因为这两个选择肯定有一个空的交集。
    • 第一种方法对我来说效果最好,它只比 NOT IN 查询快几毫秒,但一切都很重要:P 感谢您的回答和解释!
    【解决方案2】:
    SELECT id, name
    FROM mytable 
    ORDER BY id NOT IN (77, 3, 123, 1),
             FIELD(id, 77, 3, 123, 1)
    

    【讨论】:

    • 需要解释。学习How to Answer
    • 这很好用,但不幸的是它增加了长查询的加载时间一秒或更长时间。您是否知道其他可能更快的方法?
    • @Lennart 更长的查询时间是否与您现在获得所有行而不是仅 4 行的变化有关?
    • @Solarflare 否,如果我通过查询删除订单,它将检索相同的结果,但比我使用此排序方法时少大约 0.8 到 1 秒。我不得不说我的 id 数组很长,所以也许这就是为什么它需要更长的时间,因为数组被添加了两次。
    • 感谢您的回答 Juergen d,我选择了 Solarflare 的回答,因为他添加了解释,但我非常感谢您的快速响应。在我需要帮助的那一刻,它真的帮助了我,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2015-12-20
    • 2012-11-08
    • 1970-01-01
    • 2016-02-25
    相关资源
    最近更新 更多