2012-09-23 65 views
0

我有一个答案表和一个问题表以及连接它们的连接表。 quesions表有问题,答案表有这些问题的答案。问题是,这是一个多选的设置。所以答案会有一些正确的答案和一些问题的错误答案。连接表中没有条目的连接表中的数据

答案是否正确由布尔is_right表示。

如何找到哪些问题有答案不是答案表中的正确答案(以及类似地,答案没有错误的地方)?

+0

你怎么说没有错误的答案? – Vikdor

回答

1
SELECT * 
FROM questions 
WHERE EXISTS (
    SELECT TRUE 
    FROM answers a1 
    WHERE a1.question_id = questions.question_id 
    AND a1.is_right 
) 
AND NOT EXISTS (
    SELECT TRUE 
    FROM answers a2 
    WHERE a2.question_id = questions.question_id 
    AND !a2.is_right 
) 

如果你想避免由于某种原因,子查询:

SELECT question_id, 
     SUM(is_right) AS right_answers, 
     SUM(!is_right) AS wrong_answers 
FROM questions 
JOIN answers ON answers.question_id = questions.question_id 
GROUP BY question_id 
HAVING right_answers > 0 
AND wrong_answers = 0 
0

我不知道为什么你有一个连接表,因为答案只能有一个问题。

如果没有连接表,来查询在没有正确答案的问题:

SELECT questions.* 
FROM questions LEFT OUTER JOIN answers 
    ON questions.id = answer.question_id AND answer.is_right = false 
WHERE answer.id IS NULL 

有了一个连接表命名answers_questions,该SQL将是:

SELECT questions.* 
FROM questions 
    LEFT OUTER JOIN answers_questions 
    ON answers_questions.question_id = question.id 
    LEFT OUTER JOIN answers 
    ON answers_questions.answer_id = answer.id AND answer.is_right = false 
WHERE answer.id IS NULL 

这也给你的问题没有链接的答案。 要获得没有正确答案的问题,在与答案链接的问题中,将第一个LEFT OUTER JOIN更改为INNER JOIN。