在查询 db 以获取一组 id 时,mysql 不会按照指定 id 的顺序提供结果。我正在使用的查询如下:
SELECT id ,title, date FROM Table WHERE id in (7,1,5,9,3)
作为回报,提供的结果按 1、3、5、7、9 的顺序排列。
我怎样才能避免这种自动排序
在查询 db 以获取一组 id 时,mysql 不会按照指定 id 的顺序提供结果。我正在使用的查询如下:
SELECT id ,title, date FROM Table WHERE id in (7,1,5,9,3)
作为回报,提供的结果按 1、3、5、7、9 的顺序排列。
我怎样才能避免这种自动排序
如果您想id
按照中指定的顺序对结果进行排序,in clause
您可以使用FIND_IN_SET
如下:
SELECT id ,title, date
FROM Table
WHERE id in (7,1,5,9,3)
ORDER BY FIND_IN_SET(id,'7,1,5,9,3')
没有自动排序或默认排序。您看到的排序很可能是表中行的自然排序,即。它们被插入的顺序。如果您希望以其他方式对结果进行排序,请使用ORDER BY
子句指定它。SQL 中无法指定排序顺序应遵循IN
子句中项目的顺序。
SQL 中的WHERE
子句不影响排序顺序;该ORDER BY
条款就是这样做的。
如果您不使用 指定排序顺序ORDER BY
,SQL 将选择自己的顺序,这通常是主键的顺序,但也可以是任何顺序。
如果您希望以特定顺序记录记录,则需要指定一个ORDER BY
子句来告诉 SQL 您想要的顺序。
如果您想要的顺序仅基于奇怪的 ID 序列,那么您需要在ORDER BY
子句中指定它。确切地指定它会很棘手。这是可能的,但需要一些笨拙的 SQL 代码,并且会显着减慢查询速度(因为它不再使用键来查找记录)。
如果您想要的 ID 序列是因为其他一些更可预测的因素(例如,您实际上想要按字母名称顺序排列的记录),您可以这样做ORDER BY name
(或任何字段)。
如果您真的想按任意顺序按 ID 排序,您可能需要生成一个临时字段,您可以使用该字段进行排序:
SELECT *,
CASE id
WHEN 7 THEN 1
WHEN 1 THEN 2
WHEN 5 THEN 3
WHEN 3 THEN 4
WHEN 9 THEN 5
END AS mysortorder
FROM mytable
WHERE id in (7,1,5,9,3)
ORDER BY mysortorder;
您看到的行为是查询优化的结果,我希望您在 id 上有一个索引,以便 IN 语句将使用该索引以最有效的方式返回记录。由于未指定 ORDER BY 语句,数据库将假定返回记录的顺序并不重要,并将优化速度。(结帐“解释选择”)
CodeAddicts 或 Spudley 的答案将给出您想要的结果。另一种方法是为“mytable”(或另一个表)中的 id 分配优先级,并使用它来根据需要对记录进行排序。