热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mysql连接四个表并显示NULL值-MysqljoinfourtablesandshowNULLvalue

Ineedtodoaquerytogettheresultofanspecificexamforeachstudent,andIalsowanttodis

I need to do a query to get the result of an specific exam for each student , and I also want to display NULL for student who didn't enter his scores....

我需要进行查询以获得每个学生的特定考试的结果,并且我还想为没有输入他的分数的学生显示NULL。

Here is my four table

这是我的四张桌子

  1. Student table
  2. Scores table
  3. Student
  4. student_subject

enter image description dsds

enter image description here

enter image description here

enter image description here

My table link

我的表链接

  • Score table (user_id) with Student table (user_id)
  • 带有Student表的分数表(user_id)(user_id)

  • Exam table ( id ) with scores table ( exam.id)
  • 考试表(id)与分数表(exam.id)

  • student_subject ( user_id ) with student table ( user_id)

    student_subject(user_id)with student table(user_id)

  • student_subject (group_id) with exam table (group_id) (my group database is on another database for some important reason)

    student_subject(group_id)与考试表(group_id)(由于某些重要原因,我的组数据库在另一个数据库上)

My query works, but I don't have a NULL value for the student who don't have enter his score

我的查询有效,但对于没有输入分数的学生,我没有NULL值

SELECT 
    scores.result, students.id, exam.name, exam.id
FROM 
    scores
LEFT JOIN  
    students ON scores.user_id = students.user_id
LEFT JOIN 
    exam ON exam.id = scores.exam_id
LEFT JOIN 
    students_subjects as ss ON ss.user_id = students.id
LEFT JOIN 
    students_subjects ON students_subjects.group_id = exam.group_id
WHERE
    exam.id = 32
GROUP BY
    scores.id

Output

enter image description here

How can I get a null value for each student who don't have score for a specific exam ( exam.id = 32 ) ?

如何为每个没有特定考试成绩的学生(exam.id = 32)获取空值?

Edited for @sceaj

编辑@sceaj

I got this with you're query ( I change WHERE exam.id = 34 for WHERE exam.id = 36 for better testing)

我得到了你的查询(我更改WHERE exam.id = 34 for WHERE exam.id = 36 for better testing)

SELECT scores.result,students.id,exam.name, exam.id
FROM exam
INNER JOIN students_subjects ON students_subjects.group_id = exam.group_id
INNER JOIN students ON students_subjects.user_id = students.user_id
LEFT OUTER JOIN scores ON scores.user_id = students.user_id
WHERE exam.id = 36

enter image description here

2 个解决方案

#1


2  

The following should return all students, with scores from exam 32 if they exist.

以下应该返回所有学生,如果他们存在,则从考试32中得分。

SELECT scores.result,students.id,exam.name, exam.id
FROM exam
INNER JOIN scores ON exam.id = scores.exam_id
RIGHT OUTER JOIN students ON scores.user_id = students.user_id
WHERE exam.id = 32

Your select clause didn't use anything from students_subjects or aggregate functions, so I'm not sure what the join to it was for? Perhaps you can start with the above and build from there.

你的select子句没有使用students_subjects或聚合函数中的任何东西,所以我不确定它的连接是什么?也许你可以从上面开始并从那里开始构建。

Edit: New strategy based on my first comment. Try and locate all students then find scores that exist, null if none.

编辑:基于我的第一条评论的新策略。尝试找到所有学生,然后找到存在的分数,如果没有则为空。

SELECT scores.result,students.id,exam.name, exam.id
FROM exam
INNER JOIN students_subjects ON students_subjects.group_id = exam.group_id
INNER JOIN students ON students_subjects.user_id = students.user_id
LEFT OUTER JOIN scores ON scores.user_id = students.user_id
  AND scores.exam_id = exam.id
WHERE exam.id = 32

#2


0  

Don't begin with the score table, left joining all the others: you only will get lines where score is not null. Instead, do a right join, or put the scores table at the end:

不要从得分表开始,离开加入所有其他人:你只会获得得分不为空的行。相反,做一个正确的连接,或将得分表放在最后:

SELECT scores.result,students.id,exam.name, exam.id
FROM 
students LEFT JOIN scores ON scores.user_id = students.user_id
LEFT  JOIN exam on exam.id = scores.exam_id
LEFT JOIN students_subjects as ss ON ss.user_id = students.id
LEFT JOIN students_subjects ON students_subjects.group_id = exam.group_id
where exam.id = 32
group by scores.id

推荐阅读
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • 本文讨论了在使用sp_msforeachdb执行动态SQL命令时,当发生错误时如何捕获数据库名称。提供了两种解决方案,并介绍了如何正确使用'?'来显示数据库名称。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
author-avatar
超级a9厑厑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有