在MYSQL中,如何选择多行并按指定的顺序返回它们?

在MYSQL中,如何选择多行并按指定的顺序返回它们?,sql,mysql,Sql,Mysql,我知道我可以像这样选择多行: select * FROM table WHERE id in (1, 2, 3, 10, 100); 我按顺序返回结果:1,2,3,10100 但是,如果我需要按特定顺序返回结果,该怎么办?当我尝试这个: select * FROM table WHERE id in (2, 100, 3, 1, 10); 我仍然以相同的顺序返回结果:1、2、3、10、100 有没有办法按照我要求的顺序返回结果 (由于网站的设置方式存在限制,不允许我使用另一个字段值进行订购)

我知道我可以像这样选择多行:

select * FROM table WHERE id in (1, 2, 3, 10, 100);
我按顺序返回结果:
1,2,3,10100

但是,如果我需要按特定顺序返回结果,该怎么办?当我尝试这个:

select * FROM table WHERE id in (2, 100, 3, 1, 10);
我仍然以相同的顺序返回结果:
1、2、3、10、100

有没有办法按照我要求的顺序返回结果


(由于网站的设置方式存在限制,不允许我使用另一个字段值进行订购)

除非您能够按进行订购,否则没有保证的方式

您得到的排序是由于
MySQL
执行查询的方式:它将
range
中的
列表定义的范围内的所有
扫描组合成一个
range
扫描

通常,您可以使用以下方式之一强制执行订单:

  • 创建一个包含值和分拣机的临时表,用您的值填充该表,然后通过
    分拣机进行排序

    CREATE TABLE t_values (value INT NOT NULL PRIMARY KEY, sorter INT NOT NULL)
    
    INSERT
    INTO    t_values
    VALUES
    (2, 1),
    (100, 1),
    (3, 1),
    (1, 1),
    (10, 1);
    
    SELECT  m.*
    FROM    t_values v
    JOIN    mytable m
    ON      m.id = v.value
    ORDER BY
            sorter
    
  • 对在位行集执行相同的操作:

    SELECT  m.*
    FROM    (
            SELECT  2 AS value, 1 AS sorter
            UNION ALL
            SELECT  100 AS value, 2 AS sorter
            UNION ALL
            SELECT  3 AS value, 3 AS sorter
            UNION ALL
            SELECT  1 AS value, 4 AS sorter
            UNION ALL
            SELECT  10 AS value, 5 AS sorter
            )
    JOIN    mytable m
    ON      m.id = v.value
    ORDER BY
            sorter
    
  • 使用
    CASE
    子句:

    SELECT  *
    FROM    mytable m
    WHERE   id IN (1, 2, 3, 10, 100)
    ORDER BY
            CASE id
            WHEN 2 THEN 1
            WHEN 100 THEN 2
            WHEN 3 THEN 3
            WHEN 1 THEN 4
            WHEN 10 THEN 5
            END
    

  • 可以强制执行顺序,但只能基于一列或多列的值

    要按示例中指定的顺序返回行,需要添加第二列,称为“sortkey”,其值可用于按所需顺序对行进行排序, 使用ORDERBY子句。在您的示例中:

    Value    Sortkey
    -----    -------
      1         4
      2         1
      3         3
     10         5
    100         2
    
    select value FROM table where ... order by sortkey;
    

    你的措辞让我不确定使用ORDER BY是完全不可能的,还是仅仅通过其他字段进行排序。。。因此,冒着提交无用答案的风险,在这种情况下,您通常会这样排序结果

    SELECT *  
    FROM table  
    WHERE id in (2, 100, 3, 1, 10) 
    ORDER BY FIELD (id, 2, 100, 3, 1, 10)
    

    Ty W下面的解决方案是#3的一个改进版(以更短的方式),只要集很小,就可以了,但用子查询替换“in”集,表中就必须有一个sortkey列。