我有 2 个表,学生和成绩 学生表包含 id、name 和 date_of_birth 成绩表包含 id、student_id、成绩和类(class) 实际表包含更多数据。
我有一个类似的查询
SELECT s.*, AVG(g.grade) as average_grade
FROM student s LEFT JOIN grade g ON s,id = g.student_id
WHERE g.course = 'mathematics' and s.id = 1
有了这个,我可以获得我需要的数据,即学生详细信息和平均成绩,然后出现的问题是,当在成绩表中找不到course =“mathematics”
时,查询将返回 NULL。我的问题是,有没有办法让我获得 s.id = 1
详细信息以及 NULL 平均值而不是所有 NULL 值?
我希望它能够通过 1 个查询来完成,因为在我当前使用的子查询中,获取数据需要很长时间。我的主要目标是获得更快的速度,如果您有更好的方法而不是使用 1 个查询,请随时评论您的想法。此外,我尝试了多个查询和子查询来获取所有数据,但都花费了太长时间。
最佳答案
在加入部分中移动 g.course = 'mathematics'
的过滤条件
SELECT s.*, AVG(g.grade) as average_grade
FROM student s
LEFT JOIN grade g ON s.id = g.student_id AND g.course = 'mathematics'
WHERE s.id = 1
您的查询生成的结果为内联接而不是左联接,因为在 where 子句中放入 g.course = 'mathematics
会将左联接转换为内联接,将此部分移至 on
如果从 grade
表中找不到包含 course = 'mathematics'
student
表返回数据
关于php - mysql连接1个表的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50890271/