簡體   English   中英

GROUP BY和GROUP_CONCAT-如何返回正確的值?

[英]GROUP BY and GROUP_CONCAT - how to return correct values?

我有以下查詢:

SELECT ev.q1, ev.comments, es.session_number, es.title, CONCAT( np.first_name,  ' ', np.last_name ) AS speaker
FROM  `expo_session_eval` ev
LEFT JOIN expo_session es ON es.session_id = ev.session_id
LEFT JOIN expo_session_speaker ess ON ess.session_id = ev.session_id
LEFT JOIN expo_speaker sp ON sp.speaker_id = ess.speaker_id
LEFT JOIN new_people np ON np.id = sp.people_id
GROUP BY CONCAT( np.first_name,  ' ', np.last_name ) 
ORDER BY es.session_number

這將返回如下所示的數據:

session_id  q1  comments    session_number  title               speaker
===================================================================================
169         3   Good!       103            Digital Practices      Steve Bullock
169         3   Good!       103            Digital Practices      Sheila Bacon
170         1               104            LBS = Location Based   Patrick Moorhead

這是正確的,因為expo_session_eval中有兩個session_id 169記錄,但是這是不正確的,因為q1和注釋值不相同。 expo_session_speaker中有兩個記錄與session_id 169相對應-即該會話有兩個發言者。

理想情況下,我希望結果如下所示:

session_id  q1  comments    session_number  title                  speaker
===============================================================================================
169         3   Good!       103            Digital Practices        Steve Bullock, Sheila Bacon
169         5   Great!      103            Digital Practices        Steve Bullock, Sheila Bacon
170         1               104            LBS = Location Based     Patrick Moorhead

我嘗試使用GROUP_CONCAT,但是顯然我沒有正確使用它,因為當我使用此查詢時:

SELECT ev.session_id, ev.q1, ev.comments, es.session_number, es.title, GROUP_CONCAT( CONCAT( np.first_name,  ' ', np.last_name ) ) AS speaker
FROM  `expo_session_eval` ev
LEFT JOIN expo_session es ON es.session_id = ev.session_id
LEFT JOIN expo_session_speaker ess ON ess.session_id = ev.session_id
LEFT JOIN expo_speaker sp ON sp.speaker_id = ess.speaker_id
LEFT JOIN new_people np ON np.id = sp.people_id
ORDER BY es.session_number

我得到這個:

session_id  q1  comments    session_number  title                  speaker
===============================================================================================
169         3   Good!       103         Digital Practices   Steve Bullock,Sheila Bacon,Patrick Moorhead

我需要怎么做才能使session_id中的發言人列group_concat?

@NOAH的編輯

主表是expo_session_eval-每個記錄都存儲有一個session_id。 這些ID來自稱為expo_session的表。 有一個名為expo_session_speaker的交叉引用表,該表僅包含兩列-session_id和Speaker_id。 還有一個名為Speaker_id的表,其中包含Speaker_id和people_id。 people_id將表鏈接到名為new_people的表,該表包含first_name和last_name。

在expo_session_speaker中,給定session_id可以有多個記錄-每個記錄對應一個會話和一個發言人。 因此,要顯示給定會話的所有發言人,您將獲得多個記錄。 這就是group by / group_concat創意的來源; 我需要在該會話的所有記錄中顯示給定會話的所有發言人。 因此,會話169記錄1的演講者是史蒂夫·布洛克(Steve Bullock),希拉·培根(Sheila Bacon),會話169記錄2的演講者是相同的,即使兩個會話169記錄的其他選定值都不相同。

(清澈見底吧?)

您應該按session_id分組(而不是排序)

SELECT ev.session_id, ev.q1, ev.comments, es.session_number, es.title, GROUP_CONCAT(  CONCAT( np.first_name,  ' ', np.last_name ) ) AS speaker
FROM  `expo_session_eval` ev
LEFT JOIN expo_session es ON es.session_id = ev.session_id
LEFT JOIN expo_session_speaker ess ON ess.session_id = ev.session_id
LEFT JOIN expo_speaker sp ON sp.speaker_id = ess.speaker_id
LEFT JOIN new_people np ON np.id = sp.people_id
GROUP BY ev.session_id

這樣的事情應該做你想要的-

SELECT ev.session_id, ev.q1, ev.comments, es.session_number, es.title, speaker
FROM  `expo_session_eval` ev
LEFT JOIN expo_session es ON es.session_id = ev.session_id
LEFT JOIN (
    SELECT ess.session_id, GROUP_CONCAT( CONCAT( np.first_name,  ' ', np.last_name ) ) AS speaker
    FROM new_people np
    LEFT JOIN expo_speaker sp ON  np.id = sp.people_id
    LEFT JOIN expo_session_speaker ess ON sp.speaker_id = ess.speaker_id
    GROUP BY ess.session_id
) np ON np.session_id = es.session_id   
ORDER BY es.session_number

您實際上並不想在整個結果集上使用GROUP BY語句,而只是創建發言人的串聯字符串,因此需要在子查詢中完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM