3

短的

需要生成课程列表和计数

  1. 全部
  2. 未答复
  3. 已回答但未选中

问题。

详细的

为了得到这个结果,我需要使用 7 个表进行操作。

更新

数据库结构

https://docs.google.com/open?id=0B9ExyO6ktYcOenZ1WlBwdlY2R3c

在此处输入图像描述

对于全尺寸图像,请单击此处

我将解释其中的一些:

  1. answer_chk_results- 检查答案表。因此,如果此表上不存在某些答案,则表示未选中
  2. lesson_questions- 课程 <-> 问题关联(按 id)表
  3. courses-lessons- 课程 <-> 课程关联(按 id)表

只有第一个问题似乎并不难:当然,要计算所有问题的数量,我的计划如下所示:

  1. 首先,我们需要获取所有课程名称列表。查询将如下所示:

    从课程 c 中选择 c.id、c.name

  2. 然后courses-lessons通过每个选定的课程从关联表中获取所有课程1.(不知道如何继续之前的查询)

  3. 然后,按所选课程 ID(列)计算所有问题lid2.

但我无法弄清楚所有 3 个问题的最终 SQL 语句的外观。

有什么建议么?询问您是否有不清楚的地方。

4

1 回答 1

2

未回答的问题:已回答的问题是在答案表中没有答案的任何问题:

SELECT * 
FROM questions
WHERE id NOT IN (SELECT qid FROM answers)

已回答但未检查的问题:

SELECT *
FROM questions q
INNER JOIN 
(
    SELECT * 
    FROM answers
    WHERE id NOT IN answer_chk_results    -- unchecked answer
) a ON q.id = a.qid                       -- only answered questions

编辑:要获得一个未回答、未检查、所有问题都计入一个查询的课程列表:

SELECT c.id, c.name, COUNT(all.id) 'All', 
       COUNT(unanswered.id) 'Unanswered',
       COUNT(unchecked.id) 'Unchecked'
FROM courses c
INNER JOIN courses-lessons cl ON c.id = cl.cid
INNER JOIN questions all ON cl.id = all.lid
INNER JOIN
(
    SELECT * 
    FROM questions
    WHERE id NOT IN (SELECT qid FROM answers)
) unanswered ON cl.id = unchecked.lid
INNER JOIN
(
    SELECT *
    FROM questions q
    INNER JOIN 
    (
        SELECT * 
        FROM answers
        WHERE id NOT IN (SELECT aid FROM answer_chk_results)
    ) a ON q.id = a.qid 
) unchecked ON cl.id = unchecked.lid
GROUP BY c.id, c.name
于 2012-08-29T10:19:46.200 回答