MySQL - 计算多个表上的相关行数

Posted

技术标签:

【中文标题】MySQL - 计算多个表上的相关行数【英文标题】:MySQL - Count number of relating rows over multiple tables 【发布时间】:2015-01-23 23:25:04 【问题描述】:

我正在制作一个“测验应用程序”。每个测验都有多个问题(quizComponents),每个问题都有多个答案选项(quizComponentOptions),参与者可以从中选择。答案保存在 quizResults 表中。我有这些表:

测验(quizID, quizTitle); QuizComponents(componentId, quizID, quizQuestion); QuizComponentOptions(optionId, componentId, optionValue); QuizResults(resultId, personId, answerOptionId, componentId); CorrectOptions(componentId, optionId);

我想获取所有测验的列表,其中包含每个测验中的组件总数,以及任何给定 personId 的每个测验中正确/错误答案的数量。 比如:

quizTitle   total_quiz_components   correct_answers     incorrect_answers   
"Quiz 1"            3                       2                   1
"Quiz 2"            10                      1                   9

以下查询为我提供了测验中的所有行,以及每个测验包含的测验组件的总数。

SELECT q.quizTitle, count(qc.componentId) AS total_quiz_components FROM Quiz q
    LEFT JOIN QuizComponents qc ON qc.quizId=q.quizId
        GROUP BY q.quizId;

但后来我陷入了这种疯狂的关系中。

【问题讨论】:

【参考方案1】:

您需要case based aggregation 才能得到正确和错误的答案。

SELECT q.quizTitle, 
       count(qc.componentId) AS total_quiz_components ,
       sum ( case when CO.optionId = QR.answerOptionId then 1 else 0 end) as correct_answers,
       sum ( case when CO.optionId <> QR.answerOptionId then 1 else 0 end) as incorrect_answers,
FROM Quiz q
LEFT JOIN QuizComponents qc ON qc.quizId=q.quizId
LEFT JOIN QuizResults QR on 
QR.componentId = QC.componentId
LEFT JOIN CorrectOptions CO
on CO.componentId = QR.componentId
GROUP BY q.quizTitle;

【讨论】:

以上是关于MySQL - 计算多个表上的相关行数的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL:与 Group_Concatenate 一起使用的两个表上的左连接

SUM GROUP BY与多个表上的子查询

Mysql join

laravel orm :表上的条件 -> 相关表 -> 相关表

Django用相关表上的条件注释总和

多个表上的 MySQL 关系