无法弄清楚正确的SQL语句

时间:2012-08-29 09:53:18

标签: mysql sql database

需要生成课程列表并计算

  1. 所有
  2. 未应答
  3. 已解答但未经检查
  4. 问题。

    详细

    为了获得这个结果,我需要使用7个表来操作。

    更新

    数据库结构

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

    enter image description here

    For full-sized image click here

    我会解释其中一些:

    1. answer_chk_results - 已检查答案表。因此,如果此表中不存在某些答案,则表示未经检查
    2. lesson_questions - 课程< - >问题关联(通过id)表
    3. courses-lessons - 课程< - >课程协会(由id)表
    4. 只有第一个问题似乎并不那么困难:为了解决所有问题,我的计划如下:

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

        SELECT c.id,c.name FROM courses c

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

      3. 然后,根据lid

      4. 中选定的课程ID(2.列)计算所有问题

        但是我无法弄清楚最终的SQL语句对于所有3个问题的看法。

        有什么建议吗?询问是否有不清楚的事情。

1 个答案:

答案 0 :(得分: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