如何解决如何获得n个SELECTS的交集?
我有以下3个表:数据,标签和data_tag_rel。
数据
id data
------------------------------------
1 A string of long data A.
2 A string of long data B.
3 A string of long data C.
4 A string of long data D.
5 A string of long data E.
6 A string of long data F.
7 A string of long data G.
标签
id tag
------------
1 gold
2 silver
3 copper
data_tag_rel
data tag
------------------
1 1
1 2
2 1
3 2
4 3
5 1
5 2
5 3
6 1
7 1
如您所见,有数据和标签,以及一个关系表,用于确定将哪些标签分配给哪些数据。这里的数据是关于金属的。在此示例中:
金色标签已分配给5个数据字符串。 银色标签已分配给3个数据字符串。 铜标签已分配给2个数据字符串。
我想查询数据库并获得金,银和铜标签的交集。含义我想获取分配给所有3个标签的table_data。结果将只是数据表中的第一行,行ID 5:“一串长数据E。”
哪个查询可以完成此INTERSECTION?
到目前为止,我只能查询1个标签才能使查询工作:
SELECT data.id,data.data
FROM data
INNER JOIN data_tag_rel ON data.id = data_tag_rel.data
INNER JOIN tags ON data_tag_rel.tag = tags.id
WHERE tags.tag = "gold"
非常感谢!
解决方法
聚合提供了一种选择:
SELECT d.id,d.data
FROM data d
INNER JOIN data_tag_rel dtr ON d.id = dtr.data
INNER JOIN tags t ON dtr.tag = t.id
WHERE t.tag IN ('gold','silver','copper')
GROUP BY d.id,d.data
HAVING COUNT(DISTINCT t.tag) = 3;
Demo
,
速度将根据您的数据而变化。蒂姆的答案可能足够快,可以用于实际目的,但是如果您发现答案并非如此,则可以通过在需要之前不加入数据来稍微改善它(此处的其他更改只是样式上的,不太可能有任何效果):
select d.id,d.data
from (
select dtr.data as id
from data_tag_rel dtr
where dtr.tag in (select id from tag where tag in ('gold','copper')
group by dtr.data
having count(tag) = 3
) d_ids
join data d using (id)
如果您有大量数据,则对每个标签进行单独的连接可能会更快,尤其是当您知道哪些标签很少见并且可以从最稀有到最不稀奇时:
select d.id,d.data
from data_tag_rel dtr1 on dtr
join data_tag_rel dtr2 on dtr2.data=dtr1.data and dtr2.tag=(select id from tag where tag='silver')
join data_tag_rel dtr3 on dtr3.data=dtr2.data and dtr3.tag=(select id from tag where tag='copper')
join data d on d.id=dtr3.data
where dtr1.tag=(select id from tag where tag='gold')
(两个查询都未经测试)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。