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

时间:2009-09-24 18:25:01

标签: sql mysql

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

select * FROM table WHERE id in (1, 2, 3, 10, 100);

我按顺序返回结果:1, 2, 3, 10, 100

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

select * FROM table WHERE id in (2, 100, 3, 1, 10);

我仍然以相同的顺序返回结果:1, 2, 3, 10, 100

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

(由于网站设置的方式存在限制,不允许我使用其他字段值进行ORDER BY)

3 个答案:

答案 0 :(得分:7)

你说的方式我不确定使用ORDER BY是完全不可能还是仅仅通过其他领域订购...所以冒着提交无用答案的风险,这就是你通常订购结果的方式在这种情况下。

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

答案 1 :(得分:3)

除非您能够ORDER BY,否则无法保证。

您获得的排序取决于MySQL执行查询的方式:它将range列表定义的范围内的所有IN扫描合并为一个range扫描。

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

  1. 使用值和分拣机创建一个临时表,用sorter填充您的值和顺序:

    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
    
  2. 对就地行集做同样的事情:

    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
    
  3. 使用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
    

答案 2 :(得分:1)

您可以强制执行订单,但只能基于一列或多列的值。

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

Value    Sortkey
-----    -------
  1         4
  2         1
  3         3
 10         5
100         2

select value FROM table where ... order by sortkey;
相关问题