2017-09-01 61 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!