我的数据库结构是这样的:
https://docs.google.com/open?id=0B9ExyO6ktYcOenZ1WlBwdlY2R3c
部分表格说明:
answer_chk_results
- 检查答案表。因此,如果此表中不存在某些答案,则表示未选中lesson_questions
- 类(class) <-> 问题关联(按 id)表
当我这样查询数据库时:
SELECT
q.id,
q.content,
q.type
FROM
`questions_and_exercises` q,
`lesson_questions` lq
WHERE
q.id = lq.qid
AND lq.lid = 1
我正在获取所有问题列表。但我想要的是对每个问题的答案和检查答案的计数。当我使用这个查询时:
SELECT
q.id,
q.content,
q.type,
COUNT(DISTINCT a.ID) answer_count,
COUNT(DISTINCT acr.id) checked_count
FROM
`questions_and_exercises` q,
`lesson_questions` lq
LEFT JOIN answers a ON a.qid = lq.qid,
LEFT JOIN `answer_chk_results` acr ON acr.aid = a.id
WHERE
q.id = lq.qid
AND lq.lid = 1
结果只有 1 个问题的答案数错误。 (我的数据库中大约有 9-10 个问题)我错过了什么?
最佳答案
group by
会有所帮助,例如:
select q.id
, q.content
, q.type
, count(distinct a.id) as answer_count
, count(acr.checked) as checked_count
from questions_and_exercises q
join lesson_questions lq
on q.id = lq.id
left join
answers a
on a.qid = lq.qid
left join
answer_chk_results acr
on acr.aid = a.id
group by
q.id
, q.content
, q.type
请注意,count(acr.checked)
返回 answer_chk_results
表中一行的答案数。并且 count(distinct acr.checked)
返回选中列的不同值的数量。如果 checked 是 bool 值,则它始终为一或零。
关于MySQL COUNT 个意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12227216/