【问题标题】:MySQL - Ordering alphabetically, excluding "The" [duplicate]MySQL - 按字母顺序排序,不包括“The”[重复]
【发布时间】:2013-11-19 06:49:03
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以发布您的查询吗?

标签: php mysql sql


【解决方案1】:

您可以通过 SQL 查询执行此操作,方法是使用order by 中的条件语句:

order by (case when keyword like 'The %' then substr(keyword, 5, 100)
               else keyword
          end)

【讨论】:

    【解决方案2】:
    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

    【讨论】:

      【解决方案3】:

      最好有一个标题前缀字段,其中包含您不希望考虑按字母顺序排列的条目,如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 排序,同时还可以使用索引。

      【讨论】:

        【解决方案4】:

        还有一个解决方案:

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

        【讨论】:

          【解决方案5】:

          尝试使用类似的东西

          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/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-18
            • 2011-08-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多