【发布时间】:2016-06-22 11:50:27
【问题描述】:
我有 5 张桌子
1. SCHOOL[id(bigInt, primary), name(varchar)]
2. SELECTED_INDICATOR[id(bigInt, primary), school_id(bigint)]
3. TEACHER[id(bigint, primary), indicator_id(bigInt), attendance_id(int)]
4. STUDENT[id(bigint, primary), indicator_id(bigInt), attendance_id(int)]
5. MIDDAY_MEAL[id(bigint,primary), indicator_id(bigint), served(boolean), consumed_number(int)]
在 TEACHER 表中,出席的 ID 可以有值:1 或 2 或 3。 同样,在 STUDENT 表中,出席的 ID 可以有值:1 或 2。
我必须根据 SELECTED_INDICATOR id 生成报告,格式如下:
School_id |学校名称 | Total_教师 |老师_1 |老师_2 |老师_3 | Total_学生 |学生_1 |学生_2 |服务 |消费数
为此我尝试过:
select A.id, A.school_id, SC.name,
SUM(CASE WHEN T.attendance_id IN (1,2,3) THEN 1 ELSE 0 END) as TOTAL_TEACHER,
SUM(CASE WHEN T.attendance_id IN (1) THEN 1 ELSE 0 END) as TEACHERS_1,
SUM(CASE WHEN T.attendance_id IN (2) THEN 1 ELSE 0 END) as TEACHERS_2,
SUM(CASE WHEN T.attendance_id IN (3) THEN 1 ELSE 0 END) as TEACHERS_3,
SUM(CASE WHEN S.attendance_id IN (1,2) THEN 1 ELSE 0 END) as TOTAL_STUDENT,
SUM(CASE WHEN S.attendance_id IN (1) THEN 1 ELSE 0 END) as STUDENTS_1,
SUM(CASE WHEN S.attendance_id IN (2) THEN 1 ELSE 0 END) as STUDENTS_2,
M.served, M.consumed_number
from SELECTED_INDICATOR A
join SCHOOL SC on A.school_id = SC.id
join TEACHER T on A.id = T.indicator_id
join STUDENT S on A.id = S.indicator_id
join MIDDAY_MEAL M on A.id = M.indicator_id
WHERE A.STATUS = 'COMPLETED' group by A.id;
当我使用 SELECTED_INDICATOR 一次加入 TEACHER 或 STUDENT 时,它会为我提供正确的数据。但是,当我在上面的查询中使用 SELECTED_INDICATOR 同时加入 TEACHER 和 STUDENT 时,我会得到大量与教师和学生相关的字段。
我的查询有什么问题?请帮助更正它,或提供任何替代查询。
【问题讨论】:
-
midday_meal 的相关性是什么?为什么要包括它?坦率地说,数据模型看起来很奇怪,我想从每个表中查看几行数据。
-
另外,不要依赖 MySQL 对 GROUP BY 的非标准方法,您应该在 GROUP BY 子句中指定每个非聚合列。
-
将您的组更改为此;按 A.id、A.school_id、SC.Name、M.served、M.consumed_number 分组
-
感谢您的支持,我在#sagi answer中得到了解决方案。
标签: mysql sql join inner-join