我正在尝试从多个表配置中提取数据 如果这个解释含糊不清,我很抱歉,但如果不对我的程序的整个内部工作进行冗长的解释,这是我能做的最好的事情。
我在一个应用程序中有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)将在运行时动态生成。
再次感谢。
答案 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
)