问题使用Min(字段)

时间:2010-05-13 15:36:18

标签: mysql

The problem was between the keyboard and the seat folks.  
Thanks for lending your knowledge!

有这两个问题:

SELECT classroomid AS crid, startdate AS msd
FROM unitTemplates where classroomid = 6
GROUP BY classroomid

SELECT classroomid AS crid, Min(startdate) AS msd
FROM unitTemplates where classroomid = 6
GROUP BY classroomid

第二个查询使用最小函数。我的表中只有一条记录,其中一个为6,第一个查询返回msd = 20100505,第二个查询返回msd = 0(而不是预期的20100505)。如果我将“Min”更改为“Max”,则返回最高(且唯一)的startdate(20100505)。

为什么MySQL不像我正在使用的Min功能?


其他一些信息: courseid是int(11),startdate是bigInt(20)


3 个答案:

答案 0 :(得分:1)

请仔细检查实际上只有一行classroomid = 6。我怀疑有不止一行。

请注意,由于GROUP BY,您的第一个查询将始终返回最多一行,即使数据库中有多个匹配的行也是如此。使用classroomid = 6计算行数的正确方法如下:

SELECT COUNT(*)
FROM unitTemplates
WHERE classroomid = 6

请特别注意此查询中没有GROUP BY子句。

我尝试重新创建你描述的情况并且无法 - 对我来说MySQL的工作方式完全符合预期:

CREATE TABLE unitTemplates (classroomid int(11), startdate bigInt(20));
INSERT INTO unitTemplates values (6, 20100505);

SELECT classroomid AS crid, Min(startdate) AS msd
FROM unitTemplates where classroomid = 6
GROUP BY classroomid;

结果:

6, 20100505

您可以尝试在测试数据库中自己运行这些命令,以说服自己它按预期工作。

答案 1 :(得分:0)

我不确定如何格式化日期列,但您可能希望使用order by子句。如果日期是连续的,您可以使用此查询:

SELECT classroomid AS crid, startdate AS msd
FROM unitTemplates
WHERE classroomid = 6
ORDER BY startdate DESC LIMIT 1;

这将返回具有最大日期的课堂代码6的单行。将“DESC”更改为“ASC”,您将获得最小日期。

答案 2 :(得分:0)

这有点像黑客,但可能会将结果限制为非零值?

WHERE startdate NOT NULL AND startdate > 0

您确定该列中没有空值或归零日期吗?