2012-06-13 179 views
1

無論如何,如果沒有我向您顯示錶格,您將能夠幫助優化此查詢?所有這些疑問都源於優化SQL查詢與計數表的多個連接

我原來的表有以下幾列和表名爲laterec-學生

-------------------------------------------------------------- 
| studentid | name | class | latetime    | waived | 
-------------------------------------------------------------- 
| ID1111STU | Stu 1 | 1A |2012-01-09 08:09:00 |Waived | 



SELECT A.class, NoStudentsLate, 1xLATE, 2xLATE FROM (

    SELECT 
     class, 
     count(DISTINCT studentid) AS NoStudentsLate 
    FROM `laterec-students` 
    WHERE waived!="Waived" 
    GROUP BY class 

) AS A 
LEFT JOIN (

    SELECT class, count(distinct studentid) AS 1xLATE from (
     SELECT `laterec-students`.class, `laterec-students`.studentid 
     FROM `laterec-students` 
     WHERE waived!="Waived" 
     GROUP BY studentid 
     HAVING count(studentid)=1) as temp 
    GROUP BY class 
) AS B ON A.class=B.class 

LEFT JOIN (
    SELECT class, count(distinct studentid) AS 2xLATE from (
    SELECT `laterec-students`.class, `laterec-students`.studentid 
     FROM `laterec-students` 
    WHERE waived!="Waived" 
    GROUP BY studentid 
    HAVING count(studentid)=2) as temp 
    GROUP BY class 
) AS C ON A.class=C.class 

這就是我試圖完成

--------------------------------------------------------------------- 
| Class | Total # of students late | # late 1 times | # late 2 times | 
--------------------------------------------------------------------- 
| 1A | 5      |  3   |  2   | 
| 1B | 3      |  3   |  0   | 
--------------------------------------------------------------------- 

所以這是什麼意思,在1A班,總共有5名學生遲到使用學生ID計算。在這5人中,3人遲到一次,2人遲到兩次。

再次在1B班,共有3名學生遲到了,他們都只遲了一次。

+0

如果你解釋你的業務邏輯,這將有所幫助。 1xlate和2xlate應該是什麼意思?就像你期待我們通過閱讀你的代碼來弄清楚你想做什麼。這很難。謝謝。 –

+0

好的,基本上這個表格包含了遲到的學生數量的數據。我編輯了上述 – d123

+0

「遲到」是什麼意思?我仍然無法說出你在這裏做什麼。 (請原諒我的挑剔,但我發現,當我真正理解我的查詢應該產生什麼時,更容易優化它。) –

回答

3

我希望我瞭解您的查詢,但以下內容適用於我的SQL Fiddle example

SELECT 
    class, 
    SUM(cnt > 0) AS NoStudentsLate, 
    SUM(cnt = 1) AS 1xLate, 
    SUM(cnt = 2) AS 2xLate 
FROM 
(
    SELECT class, studentid, COUNT(*) AS cnt 
    FROM `laterec-students` 
    WHERE waived!='Waived' 
    GROUP BY class, studentid 
) t 
GROUP BY class; 
+0

嗨,彼得,感謝您的回答,但是我的1xLate和2xLate不是自己的表,有子查詢生成 – d123

+0

您是否嘗試過查詢?我也在生成這些列。 –

+0

哦,廢話!我非常抱歉!是的,它的作品= D非常感謝你!我很抱歉 – d123