来自LEFT_JOIN的意外结果。 (返回空值)

时间:2015-10-05 13:43:30

标签: mysql

我还在学习MySQL,我正试图将一个问题与它的答案组合在一起(就像你在学校的考试一样)。以下是我通过查询得到的结果:

enter image description here

预期结果是最后4行,其中所有数据都可用。更令人困惑的部分(对我而言)是我的任何一列中的值都不是NULL所以我不明白为什么它会被返回。

LEFT_JOIN不是执行此操作的正确方法吗?如果不是,那是什么?非常感谢链接到详细的文档。

这是我当前的查询:

SELECT 
    Q.question_id, 
    Q.question, 
    Q.account_id, 
    A.answer, 
    A.correct 
FROM quiz_answers A LEFT JOIN quiz_questions Q ON 
    A.question_id = Q.question_id 
    AND A.account_id = Q.account_id 
    AND A.account_id = 48 
    AND Q.account_id = 48 

ORDER BY Q.question_id;

查询仍然返回与条件不匹配的行,但是使用NULL而不是数据填充结果。查询的预期结果是上面显示的图像中的底部4行。

4 个答案:

答案 0 :(得分:1)

由abhik告诉

SELECT 
Q.question_id, 
Q.question, 
Q.account_id, 
A.answer, 
A.correct FROM quiz_answers A LEFT JOIN quiz_questions Q ON 
A.question_id = Q.question_id 
where A.account_id = Q.account_id 
AND A.account_id = 48 ORDER BY Q.question_id

答案 1 :(得分:0)

您需要使用简单的JOIN而不是LEFT JOIN。

来自https://dev.mysql.com/doc/refman/5.7/en/join.html

  

如果LEFT JOIN中ON或USING部分的右表没有匹配的行,则右表使用所有列设置为NULL的行。

答案 2 :(得分:0)

您首先要加入2个表,然后您想要删除(使用where)您不想看到的条目。在这种情况下,最好使用内连接:

SELECT 
    Q.question_id, 
    Q.question, 
    Q.account_id, 
    A.answer, 
    A.correct 
FROM quiz_answers A INNER JOIN quiz_questions Q ON 
    A.question_id = Q.question_id 
    AND A.account_id = Q.account_id 
Where
    A.account_id = 48 
ORDER BY Q.question_id;

答案 3 :(得分:0)

这是左连接的正确行为。它将显示连接中左表中的所有条目,如果右表中没有相应的值,则将添加null。

例如,您可以使用左连接列出数据库中的所有问题,并显示那些有答案的问题。要这样做,你必须写:

FROM quiz_questions LEFT JOIN quiz_answers

如果您只想获得那些有答案的问题的结果,那么

FROM quiz_questions JOIN quiz_answers

将仅显示两个表中的id。

你也应该这样写下你的条件:

FROM quiz_questions A JOIN quiz_answers Q ON 
    A.question_id = Q.question_id 
WHERE Q.account_id = 48 

获得理想的结果。