1

需要生成课程列表和计数

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

问题。

我的数据库结构看起来像这样

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

一些表的解释:

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

执行

    SELECT
    c.ID,
    c. NAME,
    COUNT(lq.id) AS Questions,
    COUNT(
        CASE
        WHEN a.id IS NULL THEN
            lq.id
        END
    ) AS UnAnswered,
    COUNT(
        CASE
        WHEN cr.id IS NULL THEN
            lq.id
        END
    ) AS UnChecked
FROM
    courses c
LEFT JOIN `courses-lessons` cl ON cl.cid = c.id
LEFT JOIN `lesson_questions` lq ON lq.lid = cl.lid
LEFT JOIN answers a ON a.qid = lq.qid
LEFT JOIN answer_chk_results cr ON cr.aid = a.id
GROUP BY
    c.ID

首先在SQL fiddle上使用示例数据对其进行了测试。(真实数据很大,所以我不能把它放在 sqlfiddle 上)它返回了一些值。思想运作良好。但是当我用真实数据测试它时,看到它返回了错误的值。外汇,当我手动计数时,结果all questions count必须是 25,但它返回 27。也许我做错了什么。

注意MySQL 服务器在我的本地机器上运行,所以如果你想远程连接到我的桌面并使用真实数据测试查询,我可以给你teamviewer id 和密码。

4

2 回答 2

1

我怀疑问题在于不同的连接会导致行数增加。解决此问题的最佳方法是沿每个维度使用子查询。下面是一个比较实用的方法。将选择中的 COUNT 替换为 COUNT DISTINCT:

SELECT c.ID, c. NAME,
       COUNT(distinct lq.id) AS Questions,
       COUNT(distinct CASE WHEN a.id IS NULL THEN lq.id END) AS UnAnswered,
       COUNT(distinct CASE WHEN cr.id IS NULL THEN lq.id END) AS UnChecked

与 COUNT 相比,COUNT DISTINCT 是一种资源消耗(它必须删除重复项)。但是,它可能适合您的目的。

于 2012-08-30T13:43:24.907 回答
0

使用此查询

SELECT
    c.ID,
    c.NAME,
    COUNT(lq.id) AS Questions,
    COUNT(IFNULL(a.id),lq.id)AS UnAnswered,
    COUNT(IFNULL(cr.id),lq.id)AS UnChecked,
FROM    courses c
LEFT JOIN `courses-lessons` cl ON cl.cid = c.id
LEFT JOIN `lesson_questions` AS lq ON lq.lid = cl.lid
LEFT JOIN answers a ON a.qid = lq.qid
LEFT JOIN answer_chk_results cr ON cr.aid = a.id
GROUP BY c.ID
于 2012-08-30T12:21:27.223 回答