【问题标题】:How to use JOIN in mysql to show all data which are not matching如何在mysql中使用JOIN来显示所有不匹配的数据
【发布时间】:2017-12-26 11:42:02
【问题描述】:

我想显示来自 2 个表的数据,并且我想显示它们全部,包括不匹配的数据。我试过这个查询。

SELECT * FROM student s
LEFT JOIN grade g ON g.student_id=s.student_id
WHERE s.student_id = 9

我得到的只是显示有成绩的学生,而我需要的是显示所有学生,即使他们没有任何成绩。我也尝试过使用inner joinright join,但结果是一样的。查询应该是什么?

【问题讨论】:

  • 添加样本数据表???

标签: mysql join


【解决方案1】:

问题是WHERE s.student_id = 9,因为左表(students 表)中不匹配的行将具有s.student_id 等于null,并且此where 子句将删除这些具有可为空的student_id 值的行,因为null 不等于到 9 点甚至任何东西。

尝试将where 移动到join 条件:

SELECT * 
FROM student s
LEFT JOIN grade g ON g.student_id=s.student_id AND s.student_id = 9;

或者使用NOT IN:

SELECT * 
FROM student s
WHERE s.student_id = 9
  AND student_id NOT IN(SELECT student_id 
                        from grade 
                        where student_id is not null);

【讨论】:

    【解决方案2】:

    从你所说的我认为你误解了 SQL JOIN 子句的工作原理。 如果不是这种情况,那么我们将需要有关这些表格中的内容以及您需要显示的内容的更多信息。

    您的查询是:

    从学生中选择 *

    在 g.student_id=s.student_id 上左加入 g 级

    哪里 s.student_id = 9

    你需要的是:

    我需要向所有学生展示,即使他们没有任何成绩

    您的查询要求:

    “在学生表和成绩表中选择 ID 等于 9 的学生的所有数据”

    要问的第一个问题是:你真的需要成绩表中的数据吗?

    如果是,那么您的 WHERE 子句就是问题所在,您可能不想只获得 ID=9 的学生,也不想获得其他学生(然后查看 @Brittain Ze 的 NOT IN 子句的答案)

    如果不是(你需要的是你所说的)那么SELECT * FROM Student WHERE student_id = 9 应该可以完成这项工作。 您将获得所有学生的信息,而不是他们的成绩信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 2017-10-16
      相关资源
      最近更新 更多