Mysql 按字母顺序排列的记录,带有;",&引用;“A”&引用;";在varchar字段开头的etc
我正在寻找MySQL和PostgreSQL解决此类问题的方案 假设我有许多带有Mysql 按字母顺序排列的记录,带有;",&引用;“A”&引用;";在varchar字段开头的etc,mysql,sql,postgresql,Mysql,Sql,Postgresql,我正在寻找MySQL和PostgreSQL解决此类问题的方案 假设我有许多带有标题字段的记录。书名或电影名,如《帽子里的猫》和《罗宾汉》。但是,尽管标题必须以其原始形式显示,但它们应该按照图书馆对其进行排序的方式进行排序,即将任何文章(如“the”或“An”)移动到标题的末尾 因此,“帽子里的猫”被分类为“帽子里的猫,帽子里的猫” 设计模式或编写查询的最佳方法是什么,以便这些记录按标题排序,就像库对标题排序一样?(我也希望知道这种按标题排序的技术术语。)此外,我应该注意哪些性能方面的考虑因素,以
标题
字段的记录。书名或电影名,如《帽子里的猫》和《罗宾汉》。但是,尽管标题必须以其原始形式显示,但它们应该按照图书馆对其进行排序的方式进行排序,即将任何文章(如“the”或“An”)移动到标题的末尾
因此,“帽子里的猫”被分类为“帽子里的猫,帽子里的猫”
设计模式或编写查询的最佳方法是什么,以便这些记录按标题排序,就像库对标题排序一样?(我也希望知道这种按标题排序的技术术语。)此外,我应该注意哪些性能方面的考虑因素,以及应该创建哪些索引?创建一个自定义函数(可能是sortableTitle?),该函数将修改以不需要的单词开头的字符串。用
按排序标题排序(标题)
完成查询语句。这将导致额外的CPU成本,尽管您必须对其进行基准测试才能知道这一成本是多少
您可以创建一个由触发器填充的额外列(sortTitle)。这将占用一些空间,但服务器将能够按索引对行进行排序
除上述情况外,您不能(不修改数据库服务器代码)直接按所需顺序创建索引。据我所知,这适用于MySQL和PostgreSQL。为什么不在表中添加一个“title\u prefix”字段,并将所有这些“the”和“a”字符串移动到那里?当您订购时,您将使用“标题”字段,当您呈现标题时,您可以按照任何方式进行连接。我建议您将
标题
字段分为两个字段:mainttitle
和pre
Select * from TitleTable
Order by
Case when substring(title,0,4) = 'The ' then substring(title, 4, len(title)-4)
when substring(title,0,3) = 'An ' then substring(title, 3, len(title)-3)
when substring(title,0,2) = 'A ' then substring(title, 2, len(title)-2)
else title
end
添加标题时,请检查标题是否以“a”、“The”或其他前缀开头,并将其拆分为两个字段(可能带有触发器)。您的桌子如下所示:
| pre | mainTitle |
|-----|----------------|
| The | Cat in the Hat |
| A | Space Odyssey |
| | Eyes Wide Shut |
因此,您可以在mainttitle
字段上建立索引,并将其用于排序
如果要显示完整标题,请以两种形式中的任何一种形式显示两个字段
- 如果选择这种方式,则必须相应地修改用户在表中提供搜索标题时的代码。在搜索
字段之前,必须以相同的方式拆分给定标题mainttitle
- 您必须非常非常小心地使用执行拆分的代码(触发器或其他),以便正确捕获某些特殊情况。你不想让
或A=B
A B C:学习字母表
书籍显示并排序为
和=B,A
B C:学习字母表,A
concat(ifnull(prefix,”,concat(“,”,prefix),title)
的内容可以用于视图中的该字段。或者通过对concat的一次调用:ifnull(prefix,title,concat(title,”,prefix))
对于PostgreSQL,可以在函数上创建一个索引以加快排序速度:在my_表上创建索引排序(sortableTitle(title))
Nice!一个问题,我投票选出一个答案和两条评论,告诉我我错了。好提示!