尝试连接 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
列。
如果要排除没有种族信息的行,则需要执行以下操作之一:
- 执行一个
INNER JOIN
(排除没有匹配的行,在您的情况下是没有student_info的学生( - 执行具有附加条件
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