MySQL 查询返回意外值

标签 mysql sql database

需要生成类(class)列表并统计

  1. 全部
  2. 未回答
  3. 已回答但未检查

问题。

我的数据库结构是这样的

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

部分表格说明:

  1. answer_chk_results - 检查答案表。因此,如果此表中不存在某些答案,则表示未选中
  2. lesson_questions - 类(class) <-> 问题关联(按 id)表
  3. courses-lessons - 类(class) <-> 类(class)关联(按 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 和密码。

最佳答案

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

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 是一个资源消耗大户(它必须删除重复项)。但是,它可能会很好地满足您的目的。

关于MySQL 查询返回意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12196385/

相关文章:

mysql - 如何将数据库从 Microsoft SQL Server 放到本地主机上的 phpMyadmin

java - 如何避免同时访问我网站中的付款链接

mysql - 如何将mamp中以前的备份mysql db恢复到升级版本

mysql - 语法错误,创建数据库

mysql - 如何在 SQL 查询中使用 LIKE 运算符返回与值不完全匹配但包含几个单词的数据

批量插入期间的 SQL Server 表锁定

mysql - 如何在 Dockerfile 'CMD ["mysqld"]' 之后运行脚本 shell?

php - PDO fetch() 没有错误但没有结果

php - 为什么这个简单的PHP代码无法将数据添加到我的数据库中?

mysql - 无需任何键即可连接两个表