2017-10-10 50 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

當我構建查詢時,我知道參與者的數量,所以第一種解決方案更適合我的情況 –