【问题标题】:MySQL joins, left joinMySQL 连接,左连接
【发布时间】:2012-11-13 18:46:38
【问题描述】:

所以我正在尝试编写一个带有简单连接的 MySQL 查询,以从两个不同的表中提取内容。

第一张桌子是学生桌(抱歉,它不是更漂亮,我找不到更好的放置方式)

id  first_name  last_name   major    phone_number
-------------------------------------------------
1   Eric        Larsen      CS       1234567891
2   Sam         Coons       English  1234567891
3   David       Brown       MAE      1234567891
4   Richard     Brown       CS       1234567891
5   Kendra      Griffiths   FCHD     1234567891

第二个是分数表,现在很丰富,只有一行,

id  student_id  item_id  score
------------------------------
1   1           1        20

还有一个包含项目列表的第三个表,但这个特定查询并不真正需要。

我想把所有的学生连同分数一起拉出来.

这是我写的查询。

SELECT students.first_name, students.last_name, scores.score
FROM students
     LEFT JOIN scores
     ON students.id = scores.student_id
WHERE scores.item_id =1

在我看来这应该可行,它应该拉所有学生,即使他们没有分数,因为它是左连接,但它只拉一个得分 Eric Larsen 的学生,结果看起来像

Eric, Larsen, 20

但不应该是这样吗:

first_name  last_name  score
----------------------------
Eric        Larsen     20
Sam         Coons      NULL
David       Brown      NULL
Richard     Brown      NULL
Kendra      Griffiths  NULL

?

【问题讨论】:

    标签: mysql join left-join


    【解决方案1】:

    此查询将揭示您的问题。

    SELECT students.first_name, students.last_name, scores.score, scores.item_id
        FROM students
        LEFT JOIN scores
            ON students.id = scores.student_id
    

    对于所有其他行,您会看到 scores.item_idNULL,因此您的 WHERE scores.item_id = 1 子句会失败,因此这些行不会出现在您的结果中。

    这应该会得到你想要的结果

    SELECT students.first_name, students.last_name, scores.score
        FROM students
        LEFT JOIN scores
            ON (students.id = scores.student_id)
        WHERE (scores.item_id = 1 OR scores.item_id IS NULL)
    

    SELECT students.first_name, students.last_name, scores.score
        FROM students
        LEFT JOIN scores
            ON (students.id = scores.student_id AND scores.item_id = 1)
    

    【讨论】:

    • 这得到了 exept 而不是 = NULL 它的 IS NULL。谢谢谢谢谢谢!!!
    • 好的解决了我的答案
    • 看起来您在我添加评论时编辑了帖子,但这个也可以。再次感谢!
    【解决方案2】:

    您需要将连接的列添加到您的选择 - 列中

    【讨论】:

      【解决方案3】:

      您在 SQL 查询中添加的 where 子句将结果集限制为一行。尝试删除 where 子句。

      SELECT students.first_name, students.last_name, scores.score
          FROM students
          LEFT JOIN scores
              ON students.id = scores.student_id;
      

      【讨论】:

      • 问题在于我可能想要获得许多不同的项目的分数。例如,可能有两个项目,在这种情况下,它们将是一个班级的作业。比如说作业 1 和作业 2,我想获取所有学生的姓名,如果记录了该特定作业的分数,那么该分数也是如此,如果没有分数,我仍然想要他们的名字
      • 这是一个有效的用例,但是左连接对你有什么帮助呢? where 子句将结果集限制为预期的项目,无论 item_id 是什么,您的要求都会撤回所有分数。想要撤回分数中的所有条目并通过 item_id 类型的冲突来限制它们。
      • 所以查询应该更像:SELECT student.first_name, student.last_name, scores.score FROM scores RIGHT JOIN students ON scores.student_id = scores.student_id WHERE scores.item_id = 1?跨度>
      • 我认为你对查询所做的任何事情都不会得到你想要的结果。我认为这更多的是定义您期望从查询中收到的内容。您无法检索分数中的所有连接值并仍按 item_id 过滤。这两种利益冲突,在技术上是不可能的。
      【解决方案4】:

      您提供了一个 where 条件来过滤掉记录,然后删除您应该获得所需结果的 where 条件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多