从一个到多个关系的多个标准的联合

时间:2018-04-24 10:10:43

标签: mysql sql

我认为我的大脑冻结或其他什么因为我很确定我这么做了很多次,但今天似乎无法解决这个问题:-)

这是我的问题的简化:

我有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)的事件

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中的列表大小相匹配。