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


MySQL - Ordering alphabetically, excluding "The"

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

有没有可能用SQL查询来实现这一点,或者我需要使用一些PHP来过滤以"The"开头的条目,然后重新组装它们?

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

您可以通过在order by:中使用条件语句,使用SQL查询来完成此操作

order by (case when keyword like 'The %' then substr(keyword, 5, 100)
               else keyword
          end)
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)

这是一个小提琴

您最好有一个标题前缀字段,其中包含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进行排序。

和另一个解决方案:

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

尝试使用类似的东西

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

这是不完美的,因为句子中间有"the",所以如果是这样的话,你可以替换之前"the"的其他例子:

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

有关更多想法,请参阅字符串函数。

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

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

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