2015-04-06 115 views
1

我想查詢3個表:MySQL的多連接與重複計數

classroom

id | name 
---------------- 
1 | bob's class 

student_enrollment

studentId | classroomId 
----------------------- 
    1 |  1 

student_progress

studentId | dateTime 
--------------------- 
    1  | 2014-08-15 09:33:23 

,我試圖用結果如結束:

classroomName | studentId | days 
------------------------------------------ 
Bob's class |  1  | 112 

哪裏days是天的不同數目的特定學生有dateTime條目。

SELECT classroom.name, student_enrollment.studentId, student_progress.dateTime 
FROM classroom 
JOIN student_enrollment ON student_enrollment.classroomId = classroom.id  
JOIN student_progress ON student_progress.studentId = student_enrollment.studentId 
WHERE `dateTime` >= '2014-08-01 09:00:34' 
ORDER BY classroom.name 

給我一張表,每個學生每dateTime條目。我試圖給查詢添加一個計數的任何方式,最多隻能給我一個結果,只有一個學生和不同的dateTime天的總數。

SELECT classroom.name, student_enrollment.studentId, COUNT(DISTINCT YEAR(student_progress.dateTime),MONTH(student_progress.dateTime),DAY(student_progress.dateTime)) AS days 
FROM classroom 
    JOIN student_enrollment ON student_enrollment.classroomId = classroom.id 
    JOIN student_progress ON student_progress.studentId = student_enrollment.studentId 
WHERE `dateTime` >= '2014-08-01 09:00:34' 
ORDER BY classroom.name 

我已經試過移動計數的子查詢的結合部,以及各種其他的東西,但剛剛結束了錯誤,如unknown table student_progress,只是似乎無法降落到正確的方法將查詢放在一起,以獲得每個studentIddateTime條目的不同計數。

+0

您想要考慮的複雜因素* days *而不僅僅是唯一的'dateTime'值? – Madbreaks

+0

複雜的是,我剛剛在1個教室找到1個學生的結果,其中'天'是所有不同日期時間的天數,而不是每個特定學生的不同天數。我猜是因爲我在SELECT中有student_enrollment.studentId而不是student_progress.studentId。 – soisystems

回答

0

我想你想沿着這些路線的東西:

SELECT 
    classroom.name, 
    student_progress.studentId, 
    COUNT(DISTINCT DATE_FORMAT(student_progress.dateTime, '%y-%m-%d')) AS days 
FROM classroom 
JOIN student_enrollment ON 
    student_enrollment.classroomId = classroom.id 
JOIN student_progress ON 
    student_progress.studentId = student_enrollment.studentId 
GROUP BY 
    classroom.name, 
    student_progress.studentId; 

這應該正確計算不同天主場迎戰dateTime不同的值。我不會建議將你的專欄命名爲dateTime,必然會在以後導致混淆(對於你或下一個開發者)。

+0

謝謝,完美的作品。 – soisystems

+0

除了在2014年8月1日之前不過濾日期。我在WHERE'dateTime'> ='2014-08-01 09:00:34'中添加了它,並且它仍然返回該日期之前的學生,教室和條目計數。我想我需要以某種方式將該邏輯放在COUNT中,而不是在GROUP BY – soisystems

+0

之前,而不是之前,看起來不像日期過濾的日期只是學生在student_enrollment表中顯示不止一次的怪癖,並且顯示他們的日期計爲今年無論是在現在的班級還是去年的班級。我應該能夠弄清楚如何解決這個問題。 – soisystems

1

看來你想要的是計算不同的日期。嘗試,而不是:

SELECT classroom.NAME, 
    student_enrollment.studentId, 
    COUNT(DISTINCT DATE(student_progress.DATETIME)) AS days 
FROM classroom 
INNER JOIN student_enrollment 
    ON student_enrollment.classroomId = classroom.id 
INNER JOIN student_progress 
    ON student_progress.studentId = student_enrollment.studentId 
WHERE `dateTime` >= '2014-08-01 09:00:34' 
GROUP BY classroom.NAME, student_enrollment.studentId, 
ORDER BY classroom.NAME 

我在明確GROUP BY添加也在這裏,只是因爲任何時候你用一個公式往上頂,你應該GROUP BY其他領域聚集。無論如何,MySQL會這樣做,但最好是明確的,這樣你就不會得到奇怪的結果。

+0

啊,非常接近我發佈的內容。這不會僅僅考慮日子嗎? – Madbreaks

+0

感謝您的回答,以及關於分組的提示。 – soisystems