【问题标题】:SQL: Searching at least 2 similar rows between different tablesSQL:在不同表之间搜索至少 2 个相似的行
【发布时间】:2012-10-14 06:37:22
【问题描述】:

这是我当前的设置:
我有 2 个表,RECIPEINGREDIENTS
RECIPE 包含 ID 以及其他数据。 INGREDIENTS 每个 RECIPE 都需要 X 行。
一个人如何搭配至少 2 种匹配成分的 2 种食谱?
我可以指定必须匹配的成分,但我的问题是当食谱有超过 10 种成分时,我需要两个使用相同 2 种成分的食谱,不知道哪些成分。
对不起,我的英语不是我的自然语言。如果需要,或者我不够清楚,我会发布更多详细信息。

实际例子:
食谱 1 有:鱼、土豆和盐。
食谱 2 有:火鸡和米饭。
食谱 3 有:鱼、米饭和盐。
食谱 4 有:火鸡、土豆和盐。

基于配方 1 的结果应该是:4
基于配方 2 的结果应为:无
基于配方 3 的结果应该是:1
基于配方 4 的结果应该是:1
(是的,我需要根据此处未说明的过滤器运行每个配方)

【问题讨论】:

    标签: sql search


    【解决方案1】:

    试试这样的:

    WITH REC_ING AS (
    SELECT *
    FROM RECIPE AS T1
    INNER JOIN
    INGREDIENTS AS T2
    ON T1.ID = T2.ID)
    
    SELECT *
    FROM (
    SELECT T1.ID AS ID1, T2.ID AS ID2
    FROM REC_ING AS T1
    INNER JOIN
    REC_ING AS T2
    ON T1.INGREDIENT_ID = T2.INGREDIENT_ID 
    AND T1.ID != T2.ID) AS JOINED_TAB
    GROUP BY ID1, ID2
    HAVING COUNT(*) >= 2
    

    这是一个粗略的副本。如果这听起来像您正在寻找的东西,我可以制作一个更详细的示例(包括 SQL Fiddle)。

    【讨论】:

    • 嗯...不工作,仍在试图弄清楚。食谱和配料只是一个例子。真正的餐桌与食物无关 :D :D :D
    • 好吧。我会坚持这个。它更灵活。
    【解决方案2】:

    如果您需要将其扩展到 2 个以上的成分,或者想要更详细地说明问题空间以及存在哪些替代查询,请查看这篇关于 RELATIONAL DIVISION 的扩展文章。。 p>


    select DISTINCT A.recipe_id, C.recipe_id other_recipe_id
    from INGREDIENTS A
    join INGREDIENTS B on A.recipe_id = B.recipe_id and A.ingredient < B.ingredient
    join INGREDIENTS C on A.recipe_id < C.recipe_id and C.ingredient = A.ingredient
    join INGREDIENTS D on C.recipe_id = D.recipe_id and D.ingredient < B.ingredient
    

    A 和 B 是属于同一配方的两种不同成分。 使用这些,我们连接到 C 和 D,它们是相同的两种成分 (A=C,B=D),但其中 C 和 D 属于相同的其他配方。

    这将返回共享 2 种成分的每对食谱的不同 ID。您可以通过将名称连接回配方表两次来获取实际的配方名称。

    【讨论】:

    • 这很好,但如果我需要 3 种匹配的成分,我必须更改代码。但我会对其进行一些测试。谢谢
    • 稍加修改,效果很好(请记住,原始桌子与食物无关)
    • Richard,我在获取 RECIPE 上的一个值时遇到了麻烦,你能帮忙吗?
    • 我不知道你在追求什么,也许你可以问一个关于 DDL(表结构)的新问题,示例数据,你期望什么,你尝试过什么,以及什么没有按预期工作?据我所知,查询对问题中的示例数据正常工作,因此having trouble getting one value 很难解释。
    • 对不起。仍然在这里运行一些测试。我会尽快添加信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2019-07-28
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多