【问题标题】:Number of rows returned when adding before/after date logically inconsistant添加之前/之后日期逻辑不一致时返回的行数
【发布时间】:2015-01-24 06:52:44
【问题描述】:

我有一个数据库,其中包含有关访问我们辅导中心的学生的信息。每次学生访问时都会生成一份记录,其中包括他们的姓名、学生编号、访问日期、他们在那里的时间以及他们在那里的时间。

我们为每个术语创建新表

我被要求准确计算某个学期有多少学生,所以我运行以下命令。

SELECT * FROM `tutoringdata_201350` group by `anum`

anum 是学生的唯一标识号,它返回 5525 条记录中的 524 条结果。理论上这应该是我的不重复计数。

然后我被要求在同一个表中获取某个日期之前和之后的记录,所以我运行了。

SELECT * FROM `tutoringdata_201350` WHERE `cDate` <= "09/30/2013" group by `anum`

哪个有效,就日期而言,如果我按数字排序,则没有重复的人被返回,因为我可以在结果窗口中看到它们都是唯一的。但是返回的结果总数是 375

所以为了让学生在那之后我跑

SELECT * FROM `tutoringdata_201350` WHERE `cDate` > "09/30/2013" group by `anum`

这似乎也有效,返回的结果中没有重复的学生,但返回的结果总数为 428。

375 + 428 是 803 而不是我期望的 524。我在遵循逻辑时遇到了麻烦,这两种不同类型的查询中的哪一种产生的结果数量不准确。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您正在滥用对GROUP BY 的有害非标准 MySQL 扩展。 http://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html

    你可能想要这样的东西;

    SELECT COUNT(DISTINCT anum) unique_students
      FROM `tutoringdata_201350`
     WHERE cDate <= 'whatever'
    

    您也可以这样做来了解每个学生的访问次数。

    SELECT COUNT(*) visits,
           anum
      FROM `tutoringdata_201350`
     WHERE cDate <= 'whatever'
     GROUP BY anum
    

    我认为,您在比较日期的方式上也犯了一个错误。

    MySQL 使用内部DATEDATETIME 格式。如果要将表中的此类数据项与文本字符串常量进行比较,则需要为该字符串使用正确的格式——YYYY-MM-DD。例如:

    WHERE cDate <= '2013-09-30' 
    

    您的示例中的比较不正确。 编辑。如果您的日期以文本字符串形式存储为MM/DD/YYYY,则需要使用以下类型的比较。

    WHERE STR_TO_DATE(cDate, '%m/%d/%Y') <= '2013-09-30'
    

    这会将您的旧日期字符串转换为DATE 格式。然后比较将起作用。如果你不这样做,MySQL 只是将字符串与字符串进行比较。 (如果年份不变,你可能会,也可能不会运气。)

    现在,您在 10 月 1 日之前和之后的唯一身份学生数不一定等于整个学期的唯一身份学生数。这是一个例子。

    Joe     Sept 28
    Joe     Sept 29
    Mary    Sept 30
    Henry   Sept 30
    Joe     Oct 1
    Stephen Oct 1
    

    总共有四个不同的学生。九月有三个。十月有两个。如果你把这两个数字相加,你会得到五个。这更多是因为您通过添加这两个数字来重复计算 Joe。

    【讨论】:

    • 日期错误是由于在我来这里几年前应用程序从旧的访问数据库移植到基于 Web 的 php 应用程序的结果。数据以与访问数据库中的数据相同的格式保存,以便可以将所有数据集中在一起并进行报告。因此,日期采用 MM/DD/YYYY 格式保存在文本字段中。 SELECT COUNT(DISTINCT anum) unique_students FROM tutoringdata_201350 实际上返回 524,这是我的原始计数。对两个方向运行计数会产生 375 和 428 与我上面的原件完全相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2019-04-24
    • 2021-05-08
    • 2023-04-09
    • 2016-05-15
    • 2023-04-06
    相关资源
    最近更新 更多