在没有定义排序规则的情况下订购 MySQL 字符串结果?

Posted

技术标签:

【中文标题】在没有定义排序规则的情况下订购 MySQL 字符串结果?【英文标题】:Ordering MySQL string results without a defined Collation? 【发布时间】:2013-02-04 20:56:12 【问题描述】:

假设我有以下结果:

Mackay
Mackay Airport
Melbourne
Melbourne Airport
Sydney
Sydney Ac
Sydney Airport

我怎样才能使它们以始终在它们顶部的 Airport 进行排序?按字母顺序,例如:

Mackay Airport
Mackay
Melbourne Airport
Melbourne
Sydney Airport
Sydney
Sydney Ac

对于如何让机场更加突出有点困惑。

【问题讨论】:

您只考虑“机场”还是任何字母数字词? 这不是 1NF - 你应该创建一个额外的属性 isAirport 【参考方案1】:

不确定以下查询是否涵盖所有情况,但它似乎适用于您的示例数据:

select name,
SUBSTRING_INDEX(name,'Airport',1)
as l,
LOCATE('Airport',name) as r from 
(
select 'Sydney Airport' as name
union all
select 'Sydney'
union all
select 'Sydney Ac'
union all
select '
Mackay Airport'
union all
select 'Mackay'
union all
select 'Melbourne'
union all
select 'Melbourne Airport'
)a
order by l asc, r desc

有了表格,它看起来像

select name
from table1 
ORDER BY SUBSTRING_INDEX(name,'Airport',1) ASC,
LOCATE('Airport',name) DESC

【讨论】:

哇,查询比手动排序要困难得多:-)【参考方案2】:

您似乎不能同时按整数和字符串排序,但您可以根据“机场”是否存在来派生要排序的字符串。这很愚蠢,但它有效:

ORDER BY IF(name NOT LIKE '% Airport', CONCAT(name, ' Birport'), name)

【讨论】:

【参考方案3】:

以下查询将为您提供预期的输出(即使查询很复杂)。

SELECT t.name
FROM (
SELECT @num := IF(@num IS NULL, 1, @num+1) AS number, name
FROM places
ORDER BY IF ((name LIKE '% Airport'), SUBSTRING(name, 1, LOCATE(' Airport', name) - 1), name)     DESC) t
ORDER BY t.number DESC;

这是一个例子。

http://www.sqlfiddle.com/#!2/117b7/80

【讨论】:

以上是关于在没有定义排序规则的情况下订购 MySQL 字符串结果?的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助来订购我的 MySQL 表中的时间和日期列

如何在不转换列的情况下更改 MySQL 中的表(默认)排序规则[重复]

创建自定义 MySQL 排序规则

Laravel 中正确字符和排序规则的 MySQL 设置

mysql中字符集和排序规则说明

注意Vietnamese_CI_AS排序规则下的特殊字符大小敏感问题