通过IN子句对MySQL查询结果进行排序

jms*_*rra 4 mysql sorting

我有一个像这样的mysql

SELECT * FROM table WHERE id IN(3245,76,3466,998,12984,4466,931,50,728)
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以得到id在IN子句中的顺序排序的查询结果?

非常感谢

更新:我刚刚发现这里涉及的问题 尽管如此,我的IN子句确实包含多达5000个id,所以使用'FIELD'是最好的解决方案吗?

nik*_*shr 6

如果您不介意重复ID序列,使用ORDER BY FIELD应该可以解决问题:

SELECT * FROM table WHERE id IN(3245,76,3466,998,12984,4466,931,50,728)
ORDER BY FIELD (id,3245,76,3466,998,12984,4466,931,50,728)
Run Code Online (Sandbox Code Playgroud)

正如@vyegorov在评论中指出的那样,对于大量的id,你可能需要创建一个临时表来保存实际的顺序

CREATE TEMPORARY TABLE `temp_sort` (
    `id` INT NOT NULL ,
    `seq` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
    PRIMARY KEY ( `seq` ) ,
    UNIQUE ( `id` )
);

INSERT INTO temp_sort (id) VALUES (3245),(76),(3466);

SELECT * FROM table  
INNER JOIN temp_sort ON (temp_sort.id=table.id)
ORDER BY temp_sort.seq;
Run Code Online (Sandbox Code Playgroud)

  • 如果你必须订购那么多ID,你应该创建一个单独的关系,例如:`id INTEGER,seq_nr INTEGER`,加入这个关系和用户`ORDER BY extra.seq_nr` (2认同)