左联接不联接数据


Left Join Not Joining Data

尝试连接 2 个表以根据第一个表 (student_schedule( 计算种族,其中学生可能出现 1 次以上。表 2 (student_info( 仅显示学生 1 次 ID 和学生的种族。我正在使用 LEFT JOIN,因为有时我可能会在student_info表中缺少一名学生,他们不会被计算在内(因为他们的种族没有被声明(。

 SELECT student_info.Ethnicity, COUNT(DISTINCT student_schedule.ID)
 FROM student_schedule LEFT JOIN student_info ON     
 student_schedule.ID=student_info.ID
 WHERE student_schedule.Course LIKE 'AS%'
 GROUP BY student_info.Ethnicity
 ORDER BY COUNT(DISTINCT student_schedule.ID) DESC

希望显示包含种族和计数的摘要:白色 50黑色 25西班牙裔 15亚洲 10

使用我的查询,结果显示为:"空白" 60白色 20黑色 15西班牙裔 3亚洲 2

要计算的学生总数是正确的,但种族似乎没有与表1(student_schedule(合并。不知道"空白"来自哪里。仅供参考,它不打印空白。它只是显示为缺失,旁边有一个数字。有人可以帮助查看我的查询吗?我一定错过了什么。

尝试仅使用,请按student_info.ethnicity分组并检查空

 SELECT ifnull(student_info.Ethnicity, 'not_declared'), COUNT(*)
 FROM student_schedule LEFT JOIN student_info ON     
 student_schedule.ID=student_info.ID
 WHERE student_schedule.Course LIKE 'AS%'
 GROUP BY student_info.Ethnicity
 ORDER BY COUNT(DISTINCT student_schedule.ID) DESC

 SELECT ifnull(student_info.Ethnicity, 'not_declared'), (COUNT(*)/ (select count(*) FROM student_schedule LEFT JOIN student_info ON     
 student_schedule.ID=student_info.ID
 WHERE student_schedule.Course LIKE 'AS%'))* 100
 FROM student_schedule LEFT JOIN student_info ON     
 student_schedule.ID=student_info.ID
 WHERE student_schedule.Course LIKE 'AS%'
 GROUP BY student_info.Ethnicity
 ORDER BY COUNT(DISTINCT student_schedule.ID) DESC

您将左连接原则与右连接混淆了。这句话是错误的:"我正在使用 LEFT JOIN,因为有时我可能会在student_info表中失踪一名学生,他们不会被计算在内(因为他们的种族没有被宣布(。

LEFT JOIN 关键字返回左表(表1(中的所有行,右表(表2(中的匹配行。当没有匹配项时,结果是右侧为 NULL。

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

因此,要使其正常工作,您应该使用RIGHT JOIN。

你误解了LEFT JOIN的意思。我建议您阅读有关SO上左连接和右连接之间的区别的信息(最好的图形解释(。

基本上,LEFT JOIN包括连接的第一个((表中的所有行,并联接第二个((表中与联接条件匹配的行,或者如果第二个((表中没有匹配的行,则添加NULL列。

如果要排除没有种族信息的行,则需要执行以下操作之一:

  1. 执行一个INNER JOIN(排除没有匹配的行,在您的情况下是没有student_info的学生(
  2. 执行具有附加条件RIGHT JOIN WHERE student_info.Ethnicity IS NOT NULL

其中任何一个都将消除"空白"行,并且COUNT仍将正确完成。像这样(我使用了 [内部] 连接(:

SELECT student_info.Ethnicity, COUNT(DISTINCT student_schedule.ID)
FROM student_schedule INNER JOIN student_info ON
student_schedule.ID=student_info.ID
WHERE student_schedule.Course LIKE 'AS%'
GROUP BY student_info.Ethnicity
ORDER BY COUNT(DISTINCT student_schedule.ID) DESC