2017-10-10 36 views
0

我需要一个relationnal部门执行查询使用MySQL的relationnal师

我有什么:2的表与第3表许多一对多的关系

=>会议有多个参与者和参与者可以参加多个会议

我需要:取得具有会议至少给定的参与者

这里的SQL查询该做的工作:

SELECT 
    m.meeting_id, 
    m.name, 
    m.status 
FROM meetings As m 
INNER JOIN meetings_participants AS mp ON m.meeting_id = mp.meeting_id 
WHERE m.status <> 'temporary' 
AND mp.participant_id IN (1, 2) 
GROUP BY m.meeting_id 
HAVING COUNT(DISTINCT mp.participant_id) >= 2 

SQL小提琴http://sqlfiddle.com/#!9/8a331d/6/0

  • 问题1:有没有办法选择我需要什么没有“HAVING COUNT ...'部分?

  • 问题2:在第二个查询中,我需要与给定参与者完全会面,如何操作?

+0

“问题1:有没有办法选择我需要什么,而不的“具有个性化...... '部分?“是的,您可以使用多个JOIN,但这不是一个很好的解决方案。因为您需要为每个mp.participant_id加入JOIN ...您拥有的查询更具可扩展性。 –

回答

1

问题1:有没有办法选择我需要什么没有 'HAVING 个性化......' 的一部分?

是的,你可以使用多个连接的,但不是需要一个连接,每mp.participant_id一个非常好的solution.because ......你的查询是更可扩展

查询

SELECT 
    m.meeting_id 
, m.name 
, m.status 
FROM 
    meetings AS m 
INNER JOIN meetings_participants AS mp1 ON m.meeting_id = mp1.meeting_id AND m.status <> 'temporary' AND mp1.participant_id = 1 
INNER JOIN meetings_participants AS mp2 ON m.meeting_id = mp2.meeting_id AND m.status <> 'temporary' AND mp2.participant_id = 2 

结果

| meeting_id |  name | status | 
|------------|-----------|-----------| 
|   1 | a meeting | active | 
|   5 | e meeting | cancelled | 

演示http://sqlfiddle.com/#!9/8a331d/54

问题2:在第二个查询,我需要确切 给定的参与者

会议你需要先找到COUNT为每meeting_participants有两个记录

随着

SELECT 
    meeting_id 
    FROM 
    meetings_participants 
    GROUP BY 
    meeting_id 
    HAVING COUNT(*) = 2 

,并使用迈之内像这样的查询。

的查询

SELECT 
meetings.* 
FROM ( 

SELECT 
    meeting_id 
    FROM 
    meetings_participants 
    WHERE 
    participant_id IN(1, 2) 
    AND 
    meeting_id IN(
     SELECT 
     meeting_id 
     FROM 
     meetings_participants 
     GROUP BY 
     meeting_id 
     HAVING COUNT(*) = 2 
    ) 
    GROUP BY 
    meeting_id 
    HAVING COUNT(*) = 2 
) 
meetings_participants 
INNER JOIN 
meetings 
ON 
meetings_participants.meeting_id = meetings.meeting_id 

结果

| meeting_id |  name | status | 
|------------|-----------|-----------| 
|   5 | e meeting | cancelled | 

演示http://sqlfiddle.com/#!9/8a331d/46

+0

谢谢!您对第2个问题的回答非常有帮助! –

+0

@Samuel F没问题。你还看到了sqlfiddle中的第二个SQL查询吗?第二个SQL更清楚地阅读和理解。 –

+1

当我构建查询时,我知道参与者的数量,所以第一种解决方案更适合我的情况 –