Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 按字母顺序排列的记录,带有;",&引用;“A”&引用;";在varchar字段开头的etc_Mysql_Sql_Postgresql - Fatal编程技术网

Mysql 按字母顺序排列的记录,带有;",&引用;“A”&引用;";在varchar字段开头的etc

Mysql 按字母顺序排列的记录,带有;",&引用;“A”&引用;";在varchar字段开头的etc,mysql,sql,postgresql,Mysql,Sql,Postgresql,我正在寻找MySQL和PostgreSQL解决此类问题的方案 假设我有许多带有标题字段的记录。书名或电影名,如《帽子里的猫》和《罗宾汉》。但是,尽管标题必须以其原始形式显示,但它们应该按照图书馆对其进行排序的方式进行排序,即将任何文章(如“the”或“An”)移动到标题的末尾 因此,“帽子里的猫”被分类为“帽子里的猫,帽子里的猫” 设计模式或编写查询的最佳方法是什么,以便这些记录按标题排序,就像库对标题排序一样?(我也希望知道这种按标题排序的技术术语。)此外,我应该注意哪些性能方面的考虑因素,以

我正在寻找MySQL和PostgreSQL解决此类问题的方案

假设我有许多带有
标题
字段的记录。书名或电影名,如《帽子里的猫》和《罗宾汉》。但是,尽管标题必须以其原始形式显示,但它们应该按照图书馆对其进行排序的方式进行排序,即将任何文章(如“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


iTunes通过第二个字段来实现这一点,在该字段中,标题以所需的排序格式存储,并在此字段而不是标题上排序。这听起来像是一种廉价的方法,但是当你考虑每次按标题执行String语句时,在每个标题上执行字符串操作的性能影响,而不是每次插入或更新标题时都要进行字符串操作,这是有道理的。

最好让您正在使用的程序以这种方式将其写入数据库。另一种选择是创建另一个“排序字段”,该字段在输入记录时由触发器填充,触发器将取出这些单词并将它们放在末尾。就我个人而言,我会在其中添加另一列,预先计算要排序的标题。然后,每当主标题被修改时,我就会更新这个专栏。我想排序会很快。我会说+1/2,但我想这会凑到+1。它需要修改插入代码并创建视图或修改查询代码。不过,视图的cpu时间应该不会太长。类似于
concat(ifnull(prefix,”,concat(“,”,prefix),title)
的内容可以用于视图中的该字段。或者通过对concat的一次调用:
ifnull(prefix,title,concat(title,”,prefix))
对于PostgreSQL,可以在函数上创建一个索引以加快排序速度:
在my_表上创建索引排序(sortableTitle(title))
Nice!一个问题,我投票选出一个答案和两条评论,告诉我我错了。好提示!