php - mysql连接1个表的位置

标签 php mysql join

我有 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/

相关文章:

mysql - 为什么通过 MS Access 更新 MySQL 表比插入一行占用更多?

Php mysql 连接到带有字段名称的子数组

SQL Server : table join based on record-dependent values

php - 如何在index.php文件中使用config()函数?

PHP 邮件表单不会发送电子邮件字段中的空格

php - 如何从带有标题的数据库中添加图像

php - Laravel Voyager 新用户登录时出现非法字符串偏移 'locale' 错误

mysql - 插入与现有条目相关的新条目的最快方法是什么?

mysql - 完全外连接中的 SQL 错误 1064

mysql - SQL 连接和跨三个表的计数