我们有一个标准的MySQL 5.1数据库,其中有一个名为places的表。我们有两列,name和name_bg,其中name是地方的英文名称,name_bg是该地方的保加利亚名称。
我们有两个以“РИМ”开头的地方。 “Рим”和“Римини”。
+--------+--------+--------------+
| id | name | name_bg |
+--------+--------+--------------+
| 221543 | Rimini | Римини |
| 34514 | Rome | Рим |
+--------+--------+--------------+
当这样搜索时:
select id, name from places where name like 'рим%';
或者像这样:
select id, name from places where name_bg like 'рим%';
一切都很好。
奇怪的是,这样搜索时(GROUP BY子句):
SELECT places.name, places.name_bg, places.country_id, countries.continent_id WHERE places.name LIKE 'рим%' OR places.name_bg LIKE 'рим%' ORDER ("CHAR_LENGTH(places.name), CHAR_LENGTH(places.name_bg), countries.continent_id, places.popular DESC") GROUP BY country_id LIMIT 10
查询首先返回Римини而不是Рим。
我们在查询中尝试过订单和分组,但没有任何帮助。
甚至切换了地点的ID,但发生了相同的结果。
我们希望首先得到卖空。
任何帮助都是适当的。
最佳, Yavor
答案 0 :(得分:8)
我不清楚你为什么期望这样做。 length函数是否满足您的需求?
SELECT id,
name
FROM places
WHERE name_bg LIKE 'рим%'
OR name LIKE 'рим%'
ORDER BY Length(name)
答案 1 :(得分:2)
您必须了解没有order by子句的select-query基本上是无序的。它似乎具有特定的顺序,通常以相同的方式产生。但这只是获得结果的结果。在大多数情况下,通过查看使用的索引可以预测。但你不应该以任何方式依赖它。
您可以通过添加order by子句来订购结果集:可能使用CHAR_LENGTH
函数。多字节字符计为单个字符。如果字符串的长度相等,那么排序是不确定的。因此,例如,如果您想确保结果按字母顺序排序。使用第二句陈述name
。还应注意,字母顺序由collation
完成。因此,如果将其设置为保加利亚排序规则,则按保加利亚命令排序。
答案 2 :(得分:1)
如果您没有order by子句,则不会以任何明确的顺序返回结果。这可以从查询更改为查询。如果您想要最短的结果,请按长度排序(结果)。