【问题标题】:querying id's according to an id's array根据id的数组查询id
【发布时间】:2010-11-06 18:52:26
【问题描述】:

我的网站包含一个带有两个表的 mysql 数据库。 一个表有一个名为“id_array”的字段,它包含一个字符串,如下所示: '1,3,7,78,89,102'。它表示第二个表中的一个 id 数组。

在第二个表中检索 id 的最佳策略是什么? 我想要最快的方法。

目前我正在使用“SELECT * FROM first_table WHERE id IN (id_array)”。

我以前是一个一个查询,但我认为它会慢很多。

如果有人有更好的结构来为我提供数据库,那就太好了。 这个结构是我想出的最好的,但我很确定它不是那么有效。 我需要一种快速便捷的方法来从第一个表中找到属于 id 的所有 id。

我们将不胜感激。

【问题讨论】:

    标签: mysql sql database denormalized


    【解决方案1】:

    逗号分隔值表示数据是非规范化的——IN 子句对您不起作用,因为它适用于不同的值。

    短期解决方案

    使用MySQL's FIND_IN_SET function,像这样:

    SELECT * 
      FROM first_table 
     WHERE FIND_IN_SET(id, id_array)
    

    长期解决方案

    ...不是以这种方式存储值,这意味着有一个表来存储不同的值,并且有一个表来将该不同值的表连接到原始表。即:

    FIRST_TABLE

    • first_table_id(主键)

    FIRST_TABLE_TYPE_CODES

    • type_code_id(主键)

    FIRST_TABLE_TYPE_MAP

    • first_table_id(主键)
    • type_code_id(主键)

    【讨论】:

    • 首先,我可能没有正确解释自己,因为 IN 子句对我有用。
    • 数组中的id是第二个表的主键。你是什​​么意思类型代码?第二个表的 id 只是整数,会自动递增。
    • @Tal:我做了假设,因为没有太多事情要做,而且我也不清楚。如果您不需要第二个表,那就太好了 - MAP 表是关于多对多关系的最缺失的。
    • 很高兴听到这个消息。所以你是说我的解决方案就足够了吗?这些查询是不是太慢了?
    • @Tal:测试是了解的唯一方法,但除非绝对必要,否则我不会存储逗号分隔的数据。
    【解决方案2】:

    您有一个字段包含与另一个表中的记录相关的 id?您可能希望创建一个将两个表链接在一起的查找表,以帮助您处理多对多关系。发布更多信息或您的数据库设置

    【讨论】:

    • 听起来不错。你能为我解释一下这个概念吗?设置就是您描述的方式,一个表保存另一个表中带有 id 的字符串。
    • 如果我有一个包含人员列表的人员表并且我想将他们与他们就读的大学联系起来,那么您将有 3 个表。我将使用带有 person_id 的 person 表和带有 college_id 的 College 表来表示唯一值,第三个表将有两列,一列是 College_id,另一列是 person_id(查找表)。这样一个人就可以上很多学院或学校。也许大学不是最好的例子,但希望你能明白。
    猜你喜欢
    • 2016-11-07
    • 2019-11-14
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多