【问题标题】:MySQL specify arbitrary order by idMySQL 通过 id 指定任意顺序
【发布时间】:2011-05-18 15:35:19
【问题描述】:

是否可以为 MySQL SELECT 语句指定任意顺序?例如,

SELECT * FROM table_name WHERE id IN (1, 3, 2, 9, 7) ORDER BY (1, 3, 2, 9, 7);

IN 之后直接列出的数字的顺序似乎无关紧要。

【问题讨论】:

  • @MattDiPasquale - 你已经在1,3,2,9,7 有订单,只需加载1,2,3,9,7 的结果,并根据1,3,2,9,7 的订单进行设置。任何指定的编程语言?
  • 我正在使用 WordPress、PHP。我想在 MySQL 中完成这一切,这样我就不必在 PHP 中进行任何处理。
  • @MattDiPasquale - find_in_set 速度不快,也不是很优化。在 PHP 中执行此操作更快且优化。
  • @ajreal find_in_set 并不慢,除非列表很大,mysql 只需要对它从 Where 中提取的 5 行进行排序
  • @The Scrum Meister - 5 行不会增长,但博客文章的数量会增长...

标签: mysql sql-order-by where-in


【解决方案1】:

FIND_IN_SET 函数可以解决问题

SELECT * FROM table_name WHERE id IN (1, 3, 2, 9, 7) ORDER BY FIND_IN_SET(id, '1,3,2,9,7');

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

编辑:注意 find_in_set 函数的字符串参数中缺少空格。

【讨论】:

  • 你测试了吗?我试了一下,得到的顺序是:2、3、7、9、1,不正确
【解决方案2】:

查看mysql的ORDER BY FIELD。我认为它会完全按照您的意愿行事。

【讨论】:

  • 这比 FIND_IN_SET 快吗?我敢打赌,因为它没有像 FIND_IN_SET 这样的字符串解析语法。我相信的语法是:ORDER BY FIELD(id,1,3,2,9,7)
【解决方案3】:

简单回答:

使用另一个“排序” int 字段检测您的数据,然后按该字段排序。大多数时候这应该是所有必要的。我已经成功地做到了这一点,客户可以通过在订购字段中应用 -1 或 -99 等低值来将某些产品冒泡到特色列表等中。

复杂的答案:

如果您想规范化该排序,这将适用,并且如果您有另一个字段作为顺序中的第二个因素,那么它已经在您的主表中。如果您有与每个订购点相关的其他信息(例如注释),这也会有所帮助。或者,如果很多表要实现这种任意顺序,并且您想从一个地方编排/修改该顺序。

您要做的是将“任意”订单放在您可以加入的表中,然后按该字段排序:

SELECT t.*, o.ordering
FROM table_name AS t
LEFT JOIN table_name_ordering AS o ON t.ordering_id = o.id
ORDER BY o.ordering, t.other_field

【讨论】:

  • 我想按 A、P、B、D 排序。这个答案有帮助。
猜你喜欢
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 2015-12-08
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 2018-03-29
相关资源
最近更新 更多