2014-04-27 56 views
1

我在我的數據庫,學生,參與者和活動中有三個表格。我正在努力爲所有參與某項活動的學生提供所有學生姓名,活動名稱和活動費用。我想知道這是否可能。這裏是DB,如果你想看看:http://pastebin.com/QCsQfEKFGroup_concat使用?

基本上我想有一個表,看起來像這樣: (前數據)

Name/  Activities  /Activities Cost 
carl /basketball, golf   /$500 
jane /pottery, skydiving, golf /$600 

,我想通過給某些選定的數據他們都參加的活動。

我知道如何去做所有的事情,除了選擇那些在某個活動中的所有人。

+0

活動成本是所有活動的成本的總和? –

+0

@MichaelBerkowski是的。 – carlgoodtoseeyou

+0

這是SQLFiddle中的模式:http://sqlfiddle.com/#!2/7e0b2/1命中(構建模式,您可以開始查詢您的數據) –

回答

1

您將需要幾個連接。最重要的是,要獲得他們全部參與的活動,您可以使用單獨的加入別名(對participantsactivities加入不止一次)。其中一個別名聯接在WHERE子句中僅限於具有所需活動的子句,以返回學生ID的列表。然後,使用該列表形成查詢的其餘部分。

SELECT 
    s.stu_fname, 
    s.stu_lname, 
    GROUP_CONCAT(a.act_name) AS Activities, 
    SUM(a.act_fee) AS `Activities Cost` 
FROM 
    /* These first two joins doing go into the SELECT list. 
    They are used to get the list of students with your desired activity 
    and will be used in the WHERE clause */ 
    participant plimit 
    INNER JOIN activity alimit ON plimit.act_id = alimit.act_id 
    /* Only include those students from the first 2 joins */ 
    INNER JOIN student s ON plimit.stu_id = s.stu_id 
    /* Then join through the participants to get all activities for those students */ 
    INNER JOIN participant p ON s.stu_id = p.stu_id 
    /* And to get the names of the activities */ 
    INNER JOIN activity a ON p.act_id = a.act_id 
/* Limit to only those students with golf */ 
WHERE alimit.act_name = 'pottery' 
/* Apply the aggregate GROUP BY to the rest of the columns in the SELECT */ 
GROUP BY 
    s.stu_id, 
    s.stu_fname, 
    s.stu_lname 

這是在行動:http://sqlfiddle.com/#!2/37860/6

+0

這個工作非常出色,但我也想完全理解發生了什麼,所以我問,你介意在參加者和參加者之後的'p'之後解釋學生的's'之後做什麼? – carlgoodtoseeyou

+0

@carlgoodtoseeyou這些是表格的別名。它們有兩個目的1)減少打字2)除非你給予其中一個別名以區分它們,否則你不能使用同一個表格兩次。所以我們使用了'activity'兩次,一次作爲'a',另一次作爲'alimit',對'participant'也一樣。 –

+0

可選地,'AS'關鍵字可能會使其更清晰:'FROM參與者AS plimit INNER JOIN活動AS限制....' –