如何在多对多查询的一侧找到最小公分母

时间:2010-06-26 02:28:43

标签: sql

我正在尝试从多个表配置中提取数据 如果这个解释含糊不清,我很抱歉,但如果不对我的程序的整个内部工作进行冗长的解释,这是我能做的最好的事情。

我在一个应用程序中有2个模块 第一单元显示与一组项目相关的信息 它会删除所有项目中不存在的信息。 (最低共同点)

所以...
第一项是红色和绿色 第二项是绿色和蓝色 第三项只是绿色。

因此,表一是项目列表,表格二是颜色列表 当然,第三张表格保存了这些关系。

我正在尝试让模块仅显示表2中所有项目中的元素。

在这种情况下,它会将显示的元素剥离为绿色,因为这是唯一的常见元素。

我尝试以编程方式执行此操作,这是查看和调试的噩梦。那将是一个移动应用程序,所以所有的for循环将真正落后于我的程序。我知道必须有一种方法可以用SQL做到这一点,但经过几个小时的研究,我似乎仍然无法理解如何。

感谢。

为清晰起见更新:

好吧,我在问题中犯了2个错误。 首先,我不是在寻找常见的数量,我正在寻找共同的价值。 所以我只想要在所有三个项目中都存在颜色并丢弃其余的颜色。 其次,我应该更加具体。我正在为Android手机开发一款应用,所以我使用的是Java和SQLite。

这是我到目前为止的原始形式,而不是我使用的颜色示例。 在这个代码标签中,颜色相等,而其他颜色等于项目......

SELECT DISTINCT tag.name
FROM other_tag_relationship AS otr
JOIN tag ON otr.tag_id = tag._id
WHERE otr.other_id in (2, 3, 4);

这显然会返回所有给定其他标签的所有标签的明确列表。

我现在要做的只是显示所有其他标签中可用的标签,并丢弃其余标签。比如删除2中不属于3和4的任何标签。此外,列表(2,3,4)将在运行时动态生成。

再次感谢。

4 个答案:

答案 0 :(得分:2)

根据您的描述,您可能希望通过中间表3(ItemColors)获得与所有项目(表1)相关联的颜色列表(表2):

Select IC.ColorId, C.Name
From ItemColors As IC
    Join Colors As C
        On C.Id = IC.ColorId
Group By IC.ColorId, C.Name
Having Count(*) =   (
                    Select Count(*) 
                    From Items As I2 
                    )

答案 1 :(得分:0)

你所描述的内容听起来很像INNER JOIN,但如果没有看到你的布局,那将很难说清楚。

答案 2 :(得分:0)

  

我尝试以编程方式执行此操作   看着和噩梦是一场噩梦   调试。那将是一个移动   应用所以所有for循环将真的   落后于我的计划。

然后你做错了。您只需要一个for循环和一个交集函数。例如,在Python中:

import functools
import operator

def common_colors(query_results):
    map_item_to_color = {}
    for (item, color) in query_results:
        if item in map_item_to_color:
            map_item_to_color[item].add(color)
        else:
            map_item_to_color[item] = {color}
    return functools.reduce(operator.and_, map_item_to_color.values())

# SELECT Item, Color FROM YourTables
DATA = [(1, 'red'), (1, 'green'),
        (2, 'green'), (2, 'blue'),
        (3, 'green')]
print(common_colors(DATA)) # {'green'}

SQL等价物是

SELECT Color FROM ItemColors GROUP BY Color HAVING
   COUNT(Color) = (SELECT COUNT(DISTINCT Item) FROM ItemColors);

答案 3 :(得分:0)

SELECT DISTINCT name
FROM (
    SELECT t1.name FROM other_tag_relationship AS otr
        JOIN tag AS t2 ON otr.tag_id = t2._id AND t2.other_id = 2
    UNION ALL
    SELECT t3.name FROM other_tag_relationship AS otr
        JOIN tag AS t3 ON otr.tag_id = t3._id AND t3.other_id = 3
    UNION ALL
    SELECT t4.name FROM other_tag_relationship AS otr
        JOIN tag AS t4 ON otr.tag_id = t4._id AND t4.other_id = 4
)