MySQL加入,左连接

时间:2012-11-26 09:55:16

标签: mysql join left-join

所以我试图用一个简单的连接编写一个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

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

我想拉出所有的学生以及得分.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

在我看来,这应该有效,它应该拉动所有学生,即使没有得分,因为它是左连接,但它只是拉着一个学生得分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

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

您需要将已加入的列添加到您的选择列

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您提供了一个where条件来过滤掉记录,删除那些条件,你应该得到你想要的结果。