mysql连接1表

时间:2018-06-16 17:46:09

标签: php mysql join

我有2张桌子,学生和成绩 学生表包含id,name和date_of_birth 成绩表包含id,student_id,成绩和课程 实际表包含更多数据。

我有一个像

这样的查询
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个查询,请随意评论您的想法,以获得更快的速度。另外我尝试了多个查询和子查询来获取所有数据,但这一切都需要很长时间。

2 个答案:

答案 0 :(得分:0)

在加入部分

中移动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

您的查询生成结果为内部联接未离开,因为将g.course = 'mathematics放在where子句中将左连接转换为内连接,在on子句中移动此部分仍将从student返回数据如果grade表中没有找到course = 'mathematics'

的行,则表格

答案 1 :(得分:0)

如果课程不是“数学”,如果你这样说,你仍然可以得到学生数据。

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) OR s.id = 1