2014-04-27 1 views
1

DB, 학생, 참여자 및 활동에 3 개의 테이블이 있습니다. 나는 특정 활동에 참여하는 모든 학생들의 모든 학생 이름, 활동 이름 및 활동 비용을 끌어 내려고하고 있습니다. 이것이 가능한지 궁금하네요. http://pastebin.com/QCsQfEKFGroup_concat을 (를) 사용 하시겠습니까?

는 기본적으로 나는이 보이는 테이블 원하는 : 여기에 당신이보고 먹고 싶어하면 DB는 (. 전 데이터)

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 hit (스키마 작성 및 데이터 쿼리 시작) –

답변

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'가 참가자 뒤의 'p'와 활동 후 'a'가 무엇을하는지 설명해 주시겠습니까? – carlgoodtoseeyou

+0

@carlgoodtoseeyou 이것들은 테이블의 별명입니다. 그들은 2 가지 목적을 가지고 있습니다. 1) 타이핑이 적습니다. 2) 동일한 테이블을 구별 할 수 있도록 다른 별칭을 지정하지 않으면 동일한 테이블을 두 번 사용할 수 없습니다. 그래서 우리는'액티비티 '를 두 번 사용했습니다. 한 번은'a'로, 다른 하나는'alimit'으로'참여자'와 같습니다. –

+0

선택적으로 'AS' 키워드를 사용하면'FROM participant AS INIMER JOIN 활동을 그대로 사용할 수 있습니다 .... ' –

관련 문제