高级MySQL按字母顺序排序与前缀?

时间:2011-08-24 13:18:44

标签: mysql sql database

道歉,如果这个问题已经得到解答,我已经做了大量的搜索,但没有找到答案(可能是因为我不确定它的措辞是否合适?)

是否可以使用设置前缀按字母顺序排列sort_by?例如,我有一张表中的大学列表。一些大学以University of(例如剑桥大学)为前缀,而其他大学则不是(例如达勒姆大学)。是否可以为MySQL定义一个忽略的前缀?

例如,以下列表

University of Cambridge
University of Bristol
Durham University
kings College London

应订购

University of Bristol
University of Cambridge
Durham University
Kings College London

4 个答案:

答案 0 :(得分:3)

你可以这样做:

ORDER BY IF(SUBSTRING(name, 1, 14) = 'University of ', SUBSTRING(name, 15), name)

最好在此表格上创建一个视图,将额外的name_value列集投影到上面的IF()表达式。然后,您可以按此列排序并选择它,而不必使用IF()污染您的查询。


示例视图,假设大学名称存储在name列中:

CREATE VIEW Universities AS
    SELECT
        list_universities.*,
        IF(SUBSTRING(name, 1, 14) = 'University of ',
           SUBSTRING(name, 15),
           name) AS name_value
    FROM list_universities;

然后,您可以Universitieslist_universities中选择name_value,但它会有一个额外的ORDER BY IF(...)列,您可以选择,或按顺序排列等等。< / p>

请注意,此方法(以及name)将无法使用{{1}}上的任何索引来提高排序效果。

答案 1 :(得分:1)

你可以尝试

ORDER BY REPLACE(LOWER(fieldName), 'university of', '')

答案 2 :(得分:1)

可能的方式之一

order by replace(display_name, 'University of', '');

然而,应用函数来改变列的值将导致mysql被忽略的索引 通常人们会考虑复制另一列,
这一栏通常会删除那些不需要的词 (或将值排列为排序可以工作的方式)

假设clean字段命名为order_name
它应该包含

Bristol, University
Cambridge, University
Durham, University
Kings College Cambridge
Kings College London

所以,SQL可能是

select display_name 
from tables
order by order_name;

答案 3 :(得分:0)

我把它放在SQL Management Studio中,所以我认为这是有效的MySql(我避免使用'with'作为例子)

SELECT UniversityName, REPLACE(UniversityName, 'University of', '') AS cleanName 
FROM Universities c
ORDER BY cleanName