【问题标题】:Join between Tables in SQLSQL中表之间的连接
【发布时间】: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


【解决方案1】:

尝试使用可以选择使用不同值的COUNT()。问题是表格使结果相乘。

    select A.id, A.school_id, SC.name, 
     COUNT(DISTINCT CASE WHEN T.attendance_id IN (1,2,3) THEN t.TeacherID  END) as TOTAL_TEACHER,
     COUNT(DISTINCT CASE WHEN T.attendance_id IN (1) THEN t.TeacherID END) as TEACHERS_1,
    ....
    FROM ....

【讨论】:

    【解决方案2】:
        SELECT A.id, A.school_id, SC.name,
        (SELECT COUNT(T.attendance_id) FROM TEACHER T GROUP BY T.indicator_id HAVING A.id = T.indicator_id) AS TOTAL_TEACHER,
        (SELECT COUNT(T.attendance_id) FROM TEACHER T WHERE T.attendance_id = 1 GROUP BY T.indicator_id HAVING A.id = T.indicator_id) AS TEACHERS_1,
        (SELECT COUNT(T.attendance_id) FROM TEACHER T WHERE T.attendance_id = 2 GROUP BY T.indicator_id HAVING A.id = T.indicator_id) AS TEACHERS_2,
        (SELECT COUNT(T.attendance_id) FROM TEACHER T WHERE T.attendance_id = 3 GROUP BY T.indicator_id HAVING A.id = T.indicator_id) AS TEACHERS_3,
        (SELECT COUNT(S.attendance_id) FROM STUDENT S GROUP BY S.indicator_id HAVING A.id = S.indicator_id) AS TOTAL_STUDENT,
        (SELECT COUNT(S.attendance_id) FROM STUDENT S WHERE S.attendance_id = 1 GROUP BY S.indicator_id HAVING A.id = S.indicator_id) AS STUDENTS_1,
        (SELECT COUNT(S.attendance_id) FROM STUDENT S WHERE S.attendance_id = 2 GROUP BY S.indicator_id HAVING A.id = S.indicator_id) AS STUDENTS_2,
        M.served, M.consumed_number
        FROM SELECTED_INDICATOR A
        JOIN SCHOOL SC on A.school_id = SC.id
        JOIN MIDDAY_MEAL M on A.id = M.indicator_id
    

    【讨论】:

    • 感谢您的支持。但它为子查询提供了多行。
    • 现在可以查看了。
    猜你喜欢
    • 2017-12-15
    • 2022-07-22
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多