代码之家  ›  专栏  ›  技术社区  ›  mahju

SQL数据库中的项目兼容性

sql
  •  2
  • mahju  · 技术社区  · 15 年前

    我对数据库处理很熟悉,但现在完全没有经验。但是,我遇到了一个问题。我需要构造一个SQL查询,它返回 兼容的 一组其他物品(任意大小)。 该查询将由应用程序中的脚本生成,用于搜索用户可以在其中输入任何找到的项目都应可用(兼容)的项目列表的项目。

    所以对于物品编号A,B,…,n,问题是:
    “给我所有与 B和…和“N”

    这个问题只涉及一张桌子;
    兼容的
    阿通
    ART2

    每个记录 兼容的 表示兼容关系,以便项目A和B兼容如果一列中有项目编号A的记录,另一列中有项目编号B的记录。 顺序对兼容性没有任何影响。

    现在,给定一个项目列表,我希望能够生成一个返回所有兼容项目的查询。

    例如,考虑下表
    兼容的

    A  B
    ----
    1  2
    3  1
    3  4
    

    如果我想要所有与[1]兼容的文章,查询将返回[2,3]。
    列表[2,3]生成的查询将返回[1]。
    而从列表[1,3]生成的查询会生成一个空列表。

    诚然,这可能不是解决问题的最佳方法,因此我也欢迎任何更好的解决方案。我认为这种类型的问题需要某种类型的子查询,这是一个我还没有掌握的主题。

    所以,我的问题是——有没有任何方法可以对数据库进行建模,以便以更简单的方式解决这个特定的问题,或者在任何情况下,有人可以帮助我制定查询,以及它如何随着输入量的变化而变化。任何关于这个主题的阅读提示也非常受欢迎。

    多谢

    马尔科

    2 回复  |  直到 15 年前
        1
  •  1
  •   Quassnoi    15 年前
    SELECT  id
    FROM    (
            SELECT  B AS id
            FROM    compat
            WHERE   A IN (list)
            UNION
            SELECT  A
            FROM    compat
            WHERE   B IN (list)
            ) q
    GROUP BY
            id
    HAVING  COUNT(*) = @cnt
    

    在哪里 @cnt 是列表中的项目总数。

    为了使这项工作正常,您应该确保表中没有兼容对有两个条目(即 (1, 2) (2, 1) 立刻就坏了)。

    最好有两个约束:一个确保对是唯一的,另一个检查文章是否最少 id 第一:

    ALTER TABLE compat ADD CONSTRAINT ux_compat_ab UNIQUE (A, B)
    ALTER TABLE compat ADD CONSTRAINT cc_compat_order CHECK (A < B)
    

    如果你这样做,你可以更换 UNION 更有效率 UNION ALL :

    SELECT  id
    FROM    (
            SELECT  B AS id
            FROM    compat
            WHERE   A IN (list)
            UNION ALL
            SELECT  A
            FROM    compat
            WHERE   B IN (list)
            ) q
    GROUP BY
            id
    HAVING  COUNT(*) = @cnt
    
        2
  •  0
  •   joelypolly    15 年前

    从a.id=ct.ArticleAid上的文章a inner join compattbl ct中选择*。 CT.ArticleBid的位置(此处显示ID列表)