2017-09-01 103 views
0

我有3個表。爲了讓它更容易理解,我把它轉換成了一些簡單的東西,比如不同體育活動的時間表。SQL請求,子查詢的總和按月分組

1. 第一個表「體育」是不同的運動。 它包含了這項運動的ID和名稱。

Table "sports" 
+----+-------+ 
| id | Sport | 
+----+-------+ 
| 1 | Judo | 
+----+-------+ 
| 2 | Boxe | 
+----+-------+ 

2. 第二個表「類」是指實際發生的不同的類。每門課都與體育和日期有關。 它包含ID,課程的日期,它與之相關的運動的ID,以及一個獨特的ID,使其獨特,結合日期和體育ID。

table "classes" 
+----+----------+------------+--------------+ 
| id | id_sport | dates  | unique_key | 
+----+----------+------------+--------------+ 
| 1 | 1  | 2017-03-10 | 1_2017-03-10 | 
+----+----------+------------+--------------+ 
| 2 | 2  | 2017-03-10 | 2_2017-03-10 | 
+----+----------+------------+--------------+ 
| 3 | 2  | 2017-03-17 | 2_2017-03-17 | 
+----+----------+------------+--------------+ 

3. 第三個表 「約會」 收集每一個存在。 它包含來的人的姓名,運動的身份證明以及班級的唯一關鍵字。我知道,在這張表中,列id_sport不是必需的,因爲我們可以在表類中找到它。

Table "appointments" 
+----+---------+----------+--------------+ 
| id | student | id_sport | id_class  | 
+----+---------+----------+--------------+ 
| 1 | Tom  | 1  | 1_2017-03-10 | 
+----+---------+----------+--------------+ 
| 2 | Sam  | 1  | 1_2017-03-10 | 
+----+---------+----------+--------------+ 
| 3 | Mat  | 2  | 2_2017-03-10 | 
+----+---------+----------+--------------+ 
| 4 | Mat  | 2  | 2_2017-03-17 | 
+----+---------+----------+--------------+ 
| 5 | Tom  | 2  | 2_2017-03-10 | 
+----+---------+----------+--------------+ 

我想排序一些統計數據。我試圖找出每個月出席特定運動的人數。

有了這個要求,我試圖找到出現在boxe類的人數:

SELECT 
MONTH(classes.dates) AS Month, 
    (SELECT count(*) 
    FROM appointments 
    WHERE appointments.id_sport = sports.id AND appointments.id_class = 
classes.unique_key AND sports.id = 2 LIMIT 1) AS nb_appointment 
FROM sports 
INNER JOIN classes ON classes.id_sport = sports.id 
WHERE sports.id = 2 
ORDER BY Month 

這樣做的結果是

+-------+---------------+ 
| Month | nb_appointment| 
+-------+---------------+ 
| 3  | 2    | 
+-------+---------------+ 
| 3  | 1    | 
+-------+---------------+ 

我想是的總和爲:月3 => nb_appointment 3

如果我還有一些月4,5等,它也會顯示這些月的任命總和。

我集團tryed的一個月,但它並任命沒有廣告的數量,只顯示最後...

任何想法?

這裏是我的嘗試 http://sqlfiddle.com/#!9/733782/1

我也試過包裝選擇在SUM的sql小提琴,但仍然不似乎工作:http://sqlfiddle.com/#!9/2ae510/1

我開始在PHP/SQL,對不起,如果這個問題似乎愚蠢。

+0

我想你既然選擇了sport_id = 2,你必須得到nb_appointment 3而不是5吧? – sia

回答

0

實際上,你可以換一個「SUM」在你的子查詢:

SELECT 
MONTH(classes.dates) AS Month, 
SUM(
(SELECT count(*) 
    FROM appointment 
    WHERE appointment.id_sport = sports.id 
    AND appointment.id_classes = classes.unique_key 
    AND sports.id = 2 LIMIT 1) 
) AS nb_appointment 
FROM sports 
INNER JOIN classes ON classes.id_sport = sports.id 
WHERE sports.id = 2 
ORDER BY Month 

這給出了答案3(您的文章說你預計nb_appointments爲5,但我認爲這是3?)

+0

謝謝你,我已經試過這個......它看起來像是有效的,但是如果我有幾個月,它不會。如果我有第3,4,5個月,它會返回第一個月(3)和每個月的總和:http://sqlfiddle.com/#!9/2ae510/1 – Cyril

1
select count(distinct student) , Month(c.dates) 
    from appointment a 
    inner join classes c 
    on a.id_class = c.unique_key 
    where c.id_sports = 2 
group by Month(c.date) 
0

好了,終於它的工作原理是在一個總和(包裝),並通過添加一組,像這樣:

SELECT 
MONTH(classes.dates) AS Month, 
SUM(
    (SELECT count(*) 
    FROM appointment 
    WHERE appointment.id_sport = sports.id AND appointment.id_classes = 
classes.unique_key AND sports.id = 2 LIMIT 1) 
)AS nb_appointment 
FROM sports 
INNER JOIN classes ON classes.id_sport = sports.id 
WHERE sports.id = 2 
GROUP BY Month 
ORDER BY Month 

比ks!