MySQL - 按字母顺序排序,不包括“The”

时间:2013-11-18 22:21:30

标签: php mysql sql

我正在寻找一种方法来查询我的数据库并按字母顺序排列结果,但如果条目以“The”开头,则跳过它,而是沿着下一个单词的第一个字母按字母顺序排列。

是否可以使用SQL查询执行此操作,或者是否需要使用某些PHP来过滤以“The”开头的条目,然后重新组装它们?

我已经搜索了这个问题的解决方案,但是当搜索的主要关键字是文字“THE”时,很难找到结果。任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:6)

您可以使用order by中的条件语句

,通过SQL查询执行此操作
order by (case when keyword like 'The %' then substr(keyword, 5, 100)
               else keyword
          end)

答案 1 :(得分:3)

SELECT title, IF(title LIKE "The %", CONCAT(SUBSTR(title, 4), ", The"), title) AS reordered_title
FROM mytable
ORDER BY IF(title LIKE "The %", CONCAT(SUBSTR(title, 4), ", The"), title)

Here's a fiddle

答案 2 :(得分:2)

您最好的选择可能是拥有一个标题前缀字段,其中包含TheAAn等条目,您不希望将其用于按字母顺序排列。此处提到的其他建议可以使用,但是它们会禁止使用索引进行排序,如果您有大量行,这可能会对您的应用程序造成很大问题。在这种情况下,查询可能看起来像

SELECT CONCAT(title_prefix, title) AS `full_title`, ...
FROM table
ORDER BY title ASC

修改现有表格以适应这种方法很简单。只需添加名称列,然后运行一些更新,如

UPDATE table SET title_prefix = 'The ', title = SUBSTR(title, 4) WHERE title LIKE 'The %';
UPDATE table SET title_prefix = 'A ', title = SUBSTR(title, 2) WHERE title LIKE 'A %';
UPDATE table SET title_prefix = 'An ', title = SUBSTR(title, 3) WHERE title LIKE 'An %';

即使您不想要单独的字段,也可以使用类似的更新逻辑将前缀移动到标题名称的末尾,如下所示

UPDATE table SET title = CONCAT(SUBSTR(title, 4), 'The, ') WHERE title LIKE 'The %';
etc.

无论哪种方式都允许您按title排序,同时也使用索引。

答案 3 :(得分:1)

还有一个解决方案:

select * from table
order by if(lower(substring(`field`, 1, 4)) = 'the ', substring(`field`, 5), `field`)

答案 4 :(得分:0)

尝试使用类似

的内容
SELECT * from tablename order by REPLACE(fieldname, 'The ', '');
由于句子中间带有“the”,所以

并不完美,所以如果可能是这种情况,你可以在之前替换“The”的其他实例:

SELECT * from tablename order by 
    REPLACE(
        REPLACE(
            REPLACE(fieldname, ' The', '&The&'),  
                'The ',''
        ),
        '&The&', ' The'
    );

请参阅string functions了解更多提示。

如果您可以更新到MariaDB 10,则可以使用

 SELECT * from tablename order by REGEXP_REPLACE(fieldname,'^[Tt]he ','')

请参阅:https://mariadb.com/kb/en/regexp_replace/