2015-10-05 73 views
0

当我谈到MySQL时,我仍然在学习,我试图将问题与它的答案组合在一起(就像你会在学校进行测试一样)。下面是我和我的查询得到的结果:来自LEFT_JOIN的意外结果。 (返回空值)

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行。

+1

将'AND A.account_id = 48 AND Q.account_id = 48'移到where条件而不是连接子句。 –

+1

http://blog.codinghorror。com/a-visual-explanation-of-sql-joins/ –

+0

@AbhikChakraborty这就是我想要的,谢谢。似乎它会产生相同的结果,只是阅读它。 – Hobbyist

回答

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 
+0

如果A.account_id = Q.account_id你不需要检查他们都是48 – Alfons

+0

对不起,我没有注意到 –

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; 
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 

得到wour期望的结果。