【问题标题】:MySQL - Count number of relating rows over multiple tablesMySQL - 计算多个表上的相关行数
【发布时间】: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;

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

【问题讨论】:

    标签: mysql join group-by mariadb


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 2023-03-15
      • 2012-09-27
      相关资源
      最近更新 更多