gpt4 book ai didi

mysql - 添加前后日期逻辑不一致时返回的行数

转载 作者:行者123 更新时间:2023-11-29 03:32:43 24 4
gpt4 key购买 nike

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

我们为每个学期创建新表

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

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。我在遵循逻辑时遇到问题,两种不同类型的查询中的哪一种产生的结果数量不准确。

最佳答案

您误用了 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。

关于mysql - 添加前后日期逻辑不一致时返回的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28117716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com