2014-01-31 202 views
1

我有以下來自此帖子的查詢count number of items in a row in mysql,它記錄了一個學生在課堂上一直出現/缺席的次數。多個INNER JOIN子查詢sql

SELECT 
     classlist.studentid, 
     student.name, 
     classStatus.name status, 
     COUNT(*) presentcnt 
    FROM 
     classlist 
     INNER JOIN student ON classlist.studentid=student.id 
     INNER JOIN classstatus ON classlist.presentid=classstatus.id 
     INNER JOIN (
      SELECT 
       studentid, 
       max(CASE WHEN presentid=0 THEN id END) max_0, 
       max(CASE WHEN presentid=1 THEN id END) max_1 
      FROM classlist 
      GROUP BY studentid 
     ) s 
     ON coalesce(classlist.id>least(max_0,max_1) AND classlist.id<=greatest(max_0,max_1),1) AND s.studentid=classlist.studentid 
    GROUP BY classlist.studentid 

可正常工作,

STUDENTID NAME STATUS PRESENTCNT 
    111   John Present  1 
    222   Kate Absent  2 
    333   Matt Present  5 

我想,這樣我有一欄顯示,如果學生在課堂particpated延長查詢。

如果我運行一個獨立的查詢,我得到的結果我想

SELECT 
     classlist.studentid, 
     student.name, 
     participatedStatus.name status, 
     COUNT(*) participatedcnt 
    FROM 
     classlist 
     INNER JOIN student ON classlist.studentid=student.id 
     INNER JOIN participatedStatus ON classlist.participatedid=participatedStatus.id 
     INNER JOIN (
      SELECT 
       studentid, 
       max(CASE WHEN participatedid=0 THEN id END) max_0, 
       max(CASE WHEN participatedid=1 THEN id END) max_1 
      FROM classlist 
      group by studentid 
     ) s 
     ON coalesce(classlist.id>least(max_0,max_1) 
     AND classlist.id<=greatest(max_0,max_1),1) 
     AND s.studentid=classlist.studentid 
    group by classlist.studentid 

    STUDENTID NAME STATUS PARTICIPATEDCNT 
    111   John Yes  1 
    222   Kate No  2 
    333   Matt Yes  2 

不過,我想將它們合併到一個查詢,所以我得到

STUDENTID NAME STATUS PRESENTCNT STATUS2  PARTICIPATEDCNT 
    111   John Present  1  Yes   1 
    222   Kate Absent  2  No   2 
    333   Matt Present  5  Yes   2 

我感到困惑如何能當我選擇count *時可以實現,我該如何實現這一點?

我使用的是數據的樣本是在this fiddle及以下

CREATE TABLE classlist 
     (`id` int, `studentid` int, `subjectid` int, `presentid` int, `participatedid` int); 

    CREATE TABLE student 
     (`id` int, `name` varchar(4)); 

    CREATE TABLE subject 
     (`id` int, `name` varchar(4)); 

    CREATE TABLE classStatus 
     (`id` int, `name` varchar(8)); 

    CREATE TABLE participatedStatus 
     (`id` int, `name` varchar(8)); 

    INSERT INTO classlist (`id`, `studentid`, `subjectid`, `presentid`, `participatedid`) 
    VALUES (1, 111, 1, 1, 0), (2, 222, 3, 0, 0), (3, 333, 2, 1, 0), (4, 111, 4, 0, 0), (5, 111, 1, 1, 0), (6, 222, 3, 0, 0), (7, 333, 2, 1, 1), (8, 111, 4, 0, 0), (9, 111, 4, 0, 0), (10, 111, 4, 0, 0), (11, 111, 1, 1, 1), (12, 333, 3, 1, 0), (13, 333, 2, 1, 1), (14, 333, 3, 1, 1); 

    INSERT INTO student (`id`, `name`) 
    VALUES (111, 'John'),(222, 'Kate'),(333, 'Matt'); 

    INSERT INTO subject (`id`, `name`) 
    VALUES (1, 'MATH'),(2, 'ENG'),(3, 'SCI'),(4, 'GEO'); 

    INSERT INTO classStatus (`id`, `name`) 
    VALUES (0, 'Absent'), (1, 'Present'); 

    INSERT INTO participatedStatus (`id`, `name`) 
    VALUES (0, 'No'),(1, 'Yes'); 
+0

我不知道,我跟隨。你想知道一個學生連續上課的次數和注意力嗎?那麼,舉例來說,如果一個學生連續參加了5堂課,但是在第四堂課時沒有注意到,那麼這個課程會註冊爲'3,1'? – Strawberry

回答

1
SELECT 
     studid, 
     studname, 
     status, 
     presentcnt, 
     status1, 
     participatedcnt FROM 
(SELECT 
     classlist.studentid studid, 
     student.name studname, 
     classStatus.name status, 
     COUNT(*) presentcnt 
    FROM 
     classlist 
     INNER JOIN student ON classlist.studentid=student.id 
     INNER JOIN classstatus ON classlist.presentid=classstatus.id 
     INNER JOIN (
      SELECT 
       studentid, 
       max(CASE WHEN presentid=0 THEN id END) max_0, 
       max(CASE WHEN presentid=1 THEN id END) max_1 
      FROM classlist 
      GROUP BY studentid 
     ) s 
     ON coalesce(classlist.id>least(max_0,max_1) AND classlist.id<=greatest(max_0,max_1),1) AND s.studentid=classlist.studentid 
    GROUP BY classlist.studentid)x 
JOIN 

(SELECT 
     classlist.studentid, 
     student.name, 
     participatedStatus.name status1, 
     COUNT(*) participatedcnt 
    FROM 
     classlist 
     INNER JOIN student ON classlist.studentid=student.id 
     INNER JOIN participatedStatus ON classlist.participatedid=participatedStatus.id 
     INNER JOIN (
      SELECT 
       studentid, 
       max(CASE WHEN participatedid=0 THEN id END) max_0, 
       max(CASE WHEN participatedid=1 THEN id END) max_1 
      FROM classlist 
      group by studentid 
     ) s 
     ON coalesce(classlist.id>least(max_0,max_1) 
     AND classlist.id<=greatest(max_0,max_1),1) 
     AND s.studentid=classlist.studentid 
    group by classlist.studentid)y 
ON x.studid=y.studentid 

Fiddle