我正在寻找一种方法来查询我的数据库并按字母顺序排列结果,但如果条目以“The”开头,则跳过它,而是沿着下一个单词的第一个字母按字母顺序排列。
是否可以使用SQL查询执行此操作,或者是否需要使用某些PHP来过滤以“The”开头的条目,然后重新组装它们?
我已经搜索了这个问题的解决方案,但是当搜索的主要关键字是文字“THE”时,很难找到结果。任何帮助将不胜感激!
答案 0 :(得分:6)
您可以使用order by
中的条件语句
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)
答案 2 :(得分:2)
您最好的选择可能是拥有一个标题前缀字段,其中包含The
,A
,An
等条目,您不希望将其用于按字母顺序排列。此处提到的其他建议可以使用,但是它们会禁止使用索引进行排序,如果您有大量行,这可能会对您的应用程序造成很大问题。在这种情况下,查询可能看起来像
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 ','')