4

在查询 db 以获取一组 id 时,mysql 不会按照指定 id 的顺序提供结果。我正在使用的查询如下:

SELECT id ,title, date FROM Table WHERE id in (7,1,5,9,3)

作为回报,提供的结果按 1、3、5、7、9 的顺序排列。

我怎样才能避免这种自动排序

4

4 回答 4

10

如果您想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')
于 2010-11-16T15:24:35.943 回答
3

没有自动排序或默认排序。您看到的排序很可能是表中行的自然排序,即。它们被插入的顺序。如果您希望以其他方式对结果进行排序,请使用ORDER BY子句指定它。SQL 中无法指定排序顺序应遵循IN子句中项目的顺序。

于 2010-11-16T15:21:34.167 回答
0

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;
于 2010-11-16T15:29:44.633 回答
0

您看到的行为是查询优化的结果,我希望您在 id 上有一个索引,以便 IN 语句将使用该索引以最有效的方式返回记录。由于未指定 ORDER BY 语句,数据库将假定返回记录的顺序并不重要,并将优化速度。(结帐“解释选择”)

CodeAddicts 或 Spudley 的答案将给出您想要的结果。另一种方法是为“mytable”(或另一个表)中的 id 分配优先级,并使用它来根据需要对记录进行排序。

于 2010-11-16T15:59:17.720 回答