MySQL不会首先显示最短的结果

时间:2011-01-04 18:08:49

标签: sql mysql

我们有一个标准的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

3 个答案:

答案 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子句,则不会以任何明确的顺序返回结果。这可以从查询更改为查询。如果您想要最短的结果,请按长度排序(结果)。