查询1
select Name from Country order by IF(Code IN ("USA","AFG","IND"),1,2),Name LIMIT 10
QUERY2
select Name from Country order by 2 , Name LIMIT 10 ;
Query2正在给出错误,因为我试图在第二个位置的基础上对结果集进行排序,但结果集中只有一列。的 [预期]
query1适用于所有情况。根据我对IF子句的理解,如果条件满足则返回第一个参数,否则返回第二个参数。
Query1应该适用于集合中的CODE(" USA"," AFG"," IND")因为IF将返回1并且条件将按名称排序,名称。
对于所有其他CODES ,条件将按2排序,名称和它类似于query2 但它仍在执行。
为什么这个案例成功执行,尽管它的条件是错误的。(2,名字命令)?
查询1的结果集
+----------------+
| Name |
+----------------+
| Afghanistan |
| India |
| United States |
| Albania |
| Algeria |
| American Samoa |
| Andorra |
| Angola |
| Anguilla |
| Antarctica |
+----------------+
第二个例子
mysql> SELECT Name from Country ORDER BY
-> CASE code
-> WHEN "USA" THEN 1
-> WHEN "IND" THEN 2
-> WHEN "AFG" THEN 3
-> ELSE 4 END,Name LIMIT 10 ;
此查询还为每个特定代码生成不同的位置。这将如何执行?
答案 0 :(得分:3)
想象一下你有:
ORDER BY SomeOtherColumn
SomeOtherColumn
包含的值恰好是2s和3s的混合。您认为服务器会以某种方式找到基于第二和第三列对结果进行排序的方法吗?或者它只是对这些数字进行排序?
ORDER BY <literal number>
和ORDER BY <expression that happens to return numbers>
之间存在差异。
因此,第一个查询不以任何方式使用“位置”ORDER BY
子句。
想象一下,您的数据如下所示:
Name Code Froogal
Albania ALB 2
Algeria DZA 2
Afghanistan AFG 1
American Samoa ASM 2
Andorra AND 2
India IND 1
Angola AGO 2
Anguilla AIA 2
Antarctica ATA 2
United States USA 1
您已将查询1写为:
select Name from Country order by Froogal,Name LIMIT 10
您是否仍对结果集感到惊讶,或者预计会出现错误?
答案 1 :(得分:1)
如果您希望在第1列或第2列对结果进行排序,则只提供这些列名称。您唯一需要担心的是列需要具有相同的类型,或者可以作为相同的类型进行转换。
select Name, OtherName from Country order by IF(Code IN ("USA","AFG","IND"),Name,OtherName), Name LIMIT 10
-- PS> You dont need to select the `OtherColumn` for the order by to work
请记住,使用函数和按顺序转换是非常慢的。由于您调用了表格国家/地区,我将假设表格中有些国家/地区只有非常有限的记录数量。在这种情况下,它会更慢,但在大多数情况下是可管理的。
切勿在包含许多记录的表格上使用此方法。