我正在尝试从多对多表配置中提取数据。
如果这个解释含糊不清,我很抱歉,但这是我能做的最好的事情,而不需要对我的程序的整个内部工作进行冗长的解释。
我在一个应用程序中有 2 个模块。
模块一显示与一组项目相关的信息。
它会剔除所有项目中不存在的信息。 (最小公分母)
所以...
第一项是红色和绿色。
第二项是绿色和蓝色。
第三项只是绿色。
所以表一是项目列表,表二是颜色列表。
当然,第三张表保存这些关系。
我试图让模块只显示表二中存在于表一中所有项目中的元素。
在这种情况下,它会将显示的元素剥离为绿色,因为这是唯一的公共(public)元素。
我尝试以编程方式执行此操作,查看和调试是一场噩梦。那和这将是一个移动应用程序,所以所有的 for 循环都会真正滞后于我的程序。我知道必须有一种使用 SQL 的方法,但是经过几个小时的研究,我似乎仍然无法理解如何去做。
谢谢。
更新为清楚起见:
好的,我在我的问题中犯了两个错误。
首先,我不是在寻找共同的数量,而是在寻找共同的值(value)。
所以我只想要所有三个项目中都存在的颜色并丢弃其余的。
其次,我应该更具体。我正在为 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) 将在运行时动态生成。
再次感谢。
最佳答案
根据您的描述,听起来您想要一个通过中间表 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
)
关于sql - 如何在多对多查询的一侧找到最小公分母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3122479/