Mysql 如何在ORDERBY子句中定义自定义订单?

Mysql 如何在ORDERBY子句中定义自定义订单?,mysql,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) 这可能吗?您可以使用字符串函数字段() (即使category是一个数字,它也将自动转换为字符串) 否则,要定义任何自定义订单,您可以仅在以下情况下使用CASE,例如

我有以下疑问:

SELECT *
FROM articles
WHERE article.category IN (1, 57, 67, 78)
ORDER BY article.category ASC
我不想按升序排列,而是按如下顺序排列:

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

这可能吗?

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

(即使category是一个数字,它也将自动转换为字符串)

否则,要定义任何自定义订单,您可以仅在以下情况下使用CASE,例如:

ORDER BY
  CASE
    WHEN article.category IN (1, 67) THEN 1
    WHEN article.category IN (78, 57) THEN 2
  ELSE 3 END

可以使用字符串函数字段()

(即使category是一个数字,它也将自动转换为字符串)

否则,要定义任何自定义订单,您可以仅在以下情况下使用CASE,例如:

ORDER BY
  CASE
    WHEN article.category IN (1, 67) THEN 1
    WHEN article.category IN (78, 57) THEN 2
  ELSE 3 END

使用字段功能:-

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,然后再放置任何其他类别使用字段功能:-

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,然后再放置任何其他类别

另一种实现方法是使用
连接
和子查询,其中列指示顺序:

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

实现这一点的另一种方法是使用
连接
和子查询,其中列指示顺序:

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

我可以定义两个类别而不是全部吗?例如,我希望类别1和67排在第一位。顺序的其余部分不重要。你可以,我已经用建议编辑了答案。我可以定义两个类别而不是全部吗?例如,我希望类别1和67排在第一位。顺序的其余部分不重要你可以,我已经用建议编辑了答案。