我有一个主索引表,当我查询时:
SELECT * FROM `chemical` WHERE name LIKE '%copper%' ORDER BY name ASC
分类如下:
如果我尝试另一个查询:
SELECT * FROM chemical WHERE name LIKE '%copper%' ORDER BY INSTR(name, 'copper') ASC
结果如下:
我真的不明白为什么第二个结果的排序会变成这样,至少我希望带有“(ii)”的名称会粘在一起,而“copper”保持在顶部,就像这样:
这是jpeg编辑的插图。
我的问题是:
1) instr()的排序算法是什么,使得结果出现在第二个pic中?
2) 有没有什么方法可以查询到像图3那样的结果?
2条答案
按热度按时间ny6fqffe1#
INSTR()
返回一个数字,显示子字符串在字符串中的开始位置。所以,INSTR('Copper', 'Copper')
以及INSTR('Copper (II) Sulfate', 'Copper')
两者都返回1。因此,包含这些项的行将被排序,就好像它们是相同的一样。mysql和所有dbms系统都以不可预测的顺序对相同的项进行排序。你可能想要
ORDER BY INSTR(name, 'copper') <> 1, name
. 这会让名字以Copper
首先,否则按字母顺序排序。为什么这样做?在ORDERBY子句中,mysql将布尔值解释为0和1。
INSTR('Vanadium Oxide', 'Copper')
退货0
以及INSTR('AAS Standard Copper', 'Copper')
返回14,所以INSTR('AAS Standard Copper', 'Copper') <> 1
返回false(0)。atmip9wb2#
也按名称排序,以便领带按字母顺序排列:
这将不同于ojones的答案,因为它在所有情况下都会将最早的铜币示例提前移动,而不仅仅是那些以单词开头的名称。