我有一个数据库,其中包含有关学生访问我们的辅导中心的信息。每次学生访问记录时都会产生,包括他们的姓名,他们的学生编号,他们访问的日期,他们在那里的时间以及他们在那里的时间。
我们为每个术语创建新表
我被要求得到一个不重复的计数在一定期限内有多少学生,所以我运行以下。
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,这是我所期待的。我无法遵循逻辑,两种不同类型的查询中的哪一种产生了不准确的结果。
答案 0 :(得分:0)
您正在滥用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使用内部DATE
和DATETIME
格式。如果要将表中的此类数据项与文本字符串常量进行比较,则需要为该字符串使用正确的格式 - 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
总体而言,有四个不同的学生。 9月有三个。十月有两个。如果你添加这两个数字,你得到五个。这更是因为你通过添加这两个数字来重复计算Joe。