【问题标题】:Finding alphabetical position in a large list在大列表中查找字母位置
【发布时间】:2009-03-07 15:57:53
【问题描述】:

我有一个 as400 表,其中包含大约 100 万行全名/公司名称,我想将其转换为使用另一个数据存储,同时仍与原始数据存储相匹配。

目前,用户输入搜索并几乎立即获得搜索词在表格中的字母位置和匹配页面。然后,用户可以非常快速地在记录中向上或向下分页。

数据几乎没有更新,每周大约有 50 次插入。我认为任何数据库都可以维护名称的字母索引,但我不确定如何在数据集中快速找到搜索的位置。非常感谢任何建议。

【问题讨论】:

    标签: database search alphabetized


    【解决方案1】:

    这听起来就像对结果的常规分页,只是它不是根据请求的页码或偏移量转到特定页面,而是根据用户搜索在结果中的字母顺序进入特定页面。

    假设您要获取该位置之后的 10 行和之前的 10 行。

    如果用户搜索“Smith”,您可以进行两次选择:

    SELECT
      name
    FROM
      companies
    WHERE
      name < 'Smith'
    ORDER BY
      name DESC
    LIMIT 10
    

    然后

    SELECT
      name
    FROM
      companies
    WHERE
      name >= 'Smith'
    ORDER BY
      name
    LIMIT 10
    

    您可以在一个查询中执行 UNION 来获取它,以上只是简化了。

    用户搜索的字词适合这些结果的一半。如果有任何精确匹配,则第一个精确匹配将被定位为第十一个。

    请注意,如果用户搜索“aaaaaaaa”,那么他们可能只会获得前 10 个结果,而之前没有任何内容,而对于“zzzzzzzz”,他们可能只会获得最后 10 个结果。

    我假设有问题的 SQL 引擎允许字符串之间的 >= 和

    【讨论】:

      【解决方案2】:

      如果“搜索的位置”是指按字母顺序列出的记录的编号,您可能想尝试以下操作:

      select count(*) from companies where name < 'Smith'
      

      大多数数据库应该可以很好地优化这一点(但请尝试一下——您在网络上阅读的理论并不胜过经验数据)。

      【讨论】:

        【解决方案3】:

        只是为了补充订购建议:

        • 如果这是您的标准数据检索方式,请在名称中添加索引。
        • 您可以通过组合LIMIT and OFFSET 来高效地进行分页。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-07
          • 1970-01-01
          • 1970-01-01
          • 2011-07-03
          • 1970-01-01
          • 2018-09-23
          • 1970-01-01
          • 2018-06-01
          相关资源
          最近更新 更多