如何在ORDER BY子句中定义自定义顺序?

时间:2015-12-08 14:35:16

标签: mysql

我有以下查询:

SELECT *
FROM articles
WHERE article.category IN (1, 57, 67, 78)
ORDER BY article.category ASC

我想订购它,而不是按升序排序:

ORDER BY article.category (1, 67, 78, 57)

这可能吗?

3 个答案:

答案 0 :(得分:3)

使用FIELD功能: -

SELECT *
FROM articles
WHERE article.category IN (1, 57, 67, 78)
ORDER BY FIELD(article.category, 1, 67, 78, 57)

编辑 - 如果没有找到它将返回0,所以如果你想要先排序2个值,那么可能只是在函数中有2个但是反转并按降序排序。

SELECT *
FROM articles
WHERE article.category IN (1, 57, 67, 78)
ORDER BY FIELD(article.category, 67, 1) DESC

这将首先列出1类,之后是67类,其次是其他类别

答案 1 :(得分:2)

您可以使用字符串函数FIELD():

bundle exec rake:test:clone

(即使类别是数字,它也会自动转换为字符串)。

否则,要定义任何自定义顺序,您可以使用CASE WHEN,例如:

ORDER BY FIELD(article.category, 1, 67, 78, 57)

答案 2 :(得分:0)

实现这一目标的另一种方法是使用JOIN和子查询以及指示顺序的列:

SELECT a.*          -- if join is not on `UNIQUE/PK` column DISTINCT may be required
FROM articles a
JOIN (SELECT 1 AS ord, 1 AS category
      UNION ALL SELECT 2, 57
      UNION ALL SELECT 3, 67
      UNION ALL SELECT 4, 78) AS sub
  ON a.category = sub.category
ORDER BY sub.ord ASC