尝试根据第一张桌子(student_schedule)加入2张桌子以计算种族数,其中学生可能出现超过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)。不知道"空白"是来自。仅供参考,它不打印空白。它只是显示为缺少旁边的数字。有人可以帮我查看我的查询吗?我一定错过了什么。
答案 0 :(得分:2)
尝试仅使用,通过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
答案 1 :(得分:0)
您将LEFT JOIN原则与RIGHT JOIN混淆。 这句话错了:"我正在使用LEFT JOIN,因为有时候我可能在student_info表中有一个失踪的学生而且他们不会被计算(因为他们的种族没有被宣布)。"
LEFT JOIN关键字返回左表(table1)中的所有行,右表(table2)中的匹配行。当没有匹配时,结果在右侧为NULL。
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
所以要使它工作,你应该使用RIGHT JOIN
答案 2 :(得分:0)
你误解了LEFT JOIN
的含义。我建议你在SO上阅读Difference between left join and right join(图形说明最好)。
基本上NULL
包括连接的第一个(左)表中的所有行,并且连接第二个(右)表中的行匹配连接条件,或者如果第二个(右)表中没有匹配的行,则添加INNER JOIN
列。
如果要排除没有种族信息的行,您需要做的是:
RIGHT JOIN
(排除不匹配的行,在您的情况下是没有student_info的学生)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
仍然可以正确完成。像这样(我用[INNER] JOIN):
{{1}}