【问题标题】:SQL query LEFT JOIN issue (MySQL)SQL查询LEFT JOIN问题(MySQL)
【发布时间】:2010-10-27 20:40:22
【问题描述】:

我有两张桌子

SCHOOLS(ID、SCHOOL_NAME、CITY_ID)
STUDENTS(ID、STUDENT_NAME、SCHOOL_ID)。

我想列出特定城市的学校以及学生人数(学校名称|学生人数)

做到这一点的一种方法是拥有共同相关的子查询 -

select sh.school_name, 
       (select count(*) 
          from student 
         where school_id = sh.id) as student_count 
 from schools sh 
where sh.city_id = 1

但由于不建议使用共同相关的查询,我想避免这种情况,我尝试了一个 group by -

   select sh.school_name, 
          count(st.school_id) as student_count 
     from schools sh 
left join students st on sh.id = st.school_id 
    where sh.city_id = 1 
 group by st.school_id

现在这仅在学校的学生人数 > 0 时才有效。所以我猜测左连接概念不起作用,这意味着如果任何没有学生的学校应列为 student_count=0,但这并没有发生.有趣的是 - 我确实看到了 student_count = 0 的“一个”记录,但仅此而已。

我的 LEFT JOIN 查询有什么问题吗??

【问题讨论】:

    标签: mysql sql null aggregate-functions outer-join


    【解决方案1】:

    用途:

       SELECT sh.id,
              sh.school_name, 
              COUNT(st.school_id) as student_count 
         FROM SCHOOLS sh 
    LEFT JOIN STUDENTS st on sh.id = st.school_id  
        WHERE sh.city_id = 1 
     GROUP BY sh.id, sh.school_name
    

    由于使用 LEFT JOIN,如果没有与学校关联的学生,对 st 的引用将为 NULL。 COUNT 不计算 NULL 值,因此如果没有关联的学生,则 student_count 将为零。

    【讨论】:

    • 感谢您的回复。我试过你的解决方案,但它不起作用:(
    • @user310525:你能提供一些数据让我测试吗? LEFT JOIN 可确保学生人数为零的学校不会从列表中丢失。你确定有指定的city_id 中有零计数的学校吗?
    • 是的,我很确定,因为共同相关的查询正在返回所需的结果(总行返回 = 60,学生大于 0 = 6 行)。但是 group_by 查询返回 6 + 1 行。这 1 行是第一个学生 = 0 的学校记录。
    • @user310525:我正要发布我的 CREATE TABLE 和 INSERT 语句... =)
    【解决方案2】:

    尝试按 sh.id 而不是 st.school_id 进行分组

    【讨论】:

      猜你喜欢
      • 2013-05-13
      • 1970-01-01
      • 2015-02-22
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多