0

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

?

4

4 回答 4

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_id的是NULL所有其他行,因此您的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)
于 2012-11-26T10:05:21.447 回答
0

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

于 2012-11-26T09:57:08.430 回答
0

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

SELECT students.first_name, students.last_name, scores.score
    FROM students
    LEFT JOIN scores
        ON students.id = scores.student_id;
于 2012-11-26T09:58:19.117 回答
0

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

于 2012-11-26T10:06:10.400 回答