我认为我的大脑冻结或其他什么因为我很确定我这么做了很多次,但今天似乎无法解决这个问题:-)
这是我的问题的简化:
我有2个表:具有一对多关系的事件和事件_tags:
事件: id , name
Events_tags: id , event-id , name
我正在寻找的是一个查询,以获取具有多个标签的每个事件。标准的数量可以每次都不同(0,1,2 ......)
更新: 我不够具体。 数据样本:
事件
id | name -------------------- 1 | concert 1 2 | concert 2 3 | concert 3 4 | concert 4
Events_tags *
id | event-id | name ------------------------- 1 | 1 | music 2 | 1 | live 3 | 1 | jazz 4 | 2 | music 5 | 2 | live 6 | 2 | electronic 7 | 3 | music 8 | 3 | dj 9 | 3 | electronic 10 | 4 | music
因此,一个查询将针对带有音乐和直播(音乐会1& 2)标签的事件和另一个用于音乐的事件(1到4)和第三个用于电子标签(2& 3)的事件
答案 0 :(得分:0)
例如:
SELECT E.ID, COUNT(*) FROM
EVENTS E INNER JOIN EVENTS_TAGS ET ON E.ID = ET.EVENT-ID
GROUP BY E.ID
HAVING COUNT(*) > 1
这将显示与多个标记关联的所有事件。 如果您能为我们提供解决方案,我们将更容易为您提供帮助。
答案 1 :(得分:0)
我会使用exists
:
select *
from Events e
where exists (select 1 from
from Events_tags
where event-id = e.id
group by event-id
having count(*) > 1);
答案 2 :(得分:0)
最有效的方法可能是一个简单的group by
:
我会使用exists
,但他们最有效的方法可能是:
select et.event_id
from events_tags et
group by et.event_id
having count(*) > 1;
如果事件ID足够,则不需要group by
或子查询。
编辑:
对于您修改过的查询,您可以做几乎相同的事情。
例如:
select et.event_id
from events_tags et
where et.tag_id in (1, 2)
group by et.id
having count(*) = 2; -- assumes no duplicate tags on an event
having
中的数字需要与where
中的列表大小相匹配。