【问题标题】:Order of "WHERE field IN" SQL query?“WHERE field IN”SQL 查询的顺序?
【发布时间】:2010-10-24 23:50:49
【问题描述】:

我正在使用以下 SQL 从 MySQL 数据库中选择记录:

SELECT * FROM cms_product WHERE id IN (3,22,1);

结果顺序等于“ORDER BY id ASC”,因此返回示例记录 1、3、22。如何以在 IN 子句中输入的确切方式对它们进行排序?所以订购为 3,22,1 ?谢谢你。

【问题讨论】:

标签: sql mysql sql-order-by


【解决方案1】:

多种选择 -

案例:

首选,它是 ANSI-92,可移植到其他数据库。

  SELECT * 
    FROM cms_product 
   WHERE id IN (3,22,1)
ORDER BY CASE id
           WHEN 3 THEN 1
           WHEN 22 THEN 2
           WHEN 1 THEN 3
         END

FIND_IN_SET:

  SELECT * 
    FROM cms_product 
   WHERE id IN (3,22,1)
ORDER BY FIND_IN_SET(id, '3,22,1');

字段:

  SELECT * 
    FROM cms_product 
   WHERE id IN (3,22,1)
ORDER BY FIELD(id, 3, 22, 1);

参考:

【讨论】:

    【解决方案2】:

    尝试使用ORDER BY FIELD,如:

    SELECT * FROM cms_product WHERE id IN (3,22,1) ORDER BY FIELD (id, 3, 22, 1);
    

    source here

    【讨论】:

    • 哦,实际文档。我不记得在我的阅读中偶然发现了这一点,所以谢谢你的链接:)
    【解决方案3】:

    它可能不是很整洁,但您可能想要执行以下操作:

    SELECT    * 
    FROM      cms_product 
    WHERE     id IN (3, 22, 1)
    ORDER BY  id = 3 DESC, id = 22 DESC, id = 1 DESC;
    

    测试用例:

    CREATE TABLE cms_product (id int, value int);
    
    INSERT INTO cms_product VALUES (1, 100);
    INSERT INTO cms_product VALUES (3, 200);
    INSERT INTO cms_product VALUES (22, 300);
    

    结果:

    +------+-------+
    | id   | value |
    +------+-------+
    |    3 |   200 |
    |   22 |   300 |
    |    1 |   100 |
    +------+-------+
    3 rows in set (0.02 sec)
    

    更新:

    @Dave@OMG Ponies 建议的 ... ORDER BY FIELD (id, 3, 22, 1) 返回相同的结果,实际上更简洁。

    【讨论】:

    • 非常怀疑这是否会扩展到很长的 IN 列表。
    【解决方案4】:

    你不能,它必须是 ASC 或 DESC。

    【讨论】:

      【解决方案5】:

      按字段排序(id, '3', '22', '1') ???

      【讨论】:

        猜你喜欢
        • 2011-01-21
        • 1970-01-01
        • 2016-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 2021-03-15
        • 1970-01-01
        相关资源
        最近更新 更多