前两天做了个系统,用mysql做的,但是很诡异的事情出现了。select * from checkinout as c
where hour(checkTime)<12 and c.userId in(select b.userid from ....)
group by day(checkTime) ,c.userId order by c.checkTime asc上面的语句的意思是说查询每个人当天12点以前第一条打卡的记录,
现在出现的问题是,只要in()里面的值记录少于等于15条的时候,就能正常,但是一旦大于15条记录后,就会有问题出现。
所以觉得很诡异
手动添加了具体的值in(1,2,3,4,5,6...15)这样的话就正确,
c.userId in(这里要是超过15条记录出来的结果有些记录就会不正确)
有些记录就会不正确。。可以告诉我为什么吗?
有遇见过这样的问题的吗?
这个东西in()里面查的是userID
where hour(checkTime)<12 and c.userId in(select b.userid from ....)
group by day(checkTime) ,c.userId order by c.checkTime asc上面的语句的意思是说查询每个人当天12点以前第一条打卡的记录,
现在出现的问题是,只要in()里面的值记录少于等于15条的时候,就能正常,但是一旦大于15条记录后,就会有问题出现。
所以觉得很诡异
手动添加了具体的值in(1,2,3,4,5,6...15)这样的话就正确,
c.userId in(这里要是超过15条记录出来的结果有些记录就会不正确)
有些记录就会不正确。。可以告诉我为什么吗?
有遇见过这样的问题的吗?
这个东西in()里面查的是userID
2、贴记录及要求结果出来看看
。出来的结果比如说我在c.userid in(34)这样的话就会取到有一条记录是 34 2010-07-05 7:45:30的记录
但是要是c.userId in(这里要是超过15个的话。。) 出来的记录就会显示 34 2010-07-05 9:46:00
所以我觉得很奇怪。。
我反复测试了许多遍了
select day(checkTime) ,c.userId from checkinout as c
where hour(checkTime)<12 and c.userId in(select b.userid from ....)
group by day(checkTime) ,c.userId order by c.checkTime asc
因为我要取的的checktime的具体值的。。所以
。出来的结果比如说我在c.userid in(34)这样的话就会取到有一条记录是 34 2010-07-05 7:45:30的记录
但是要是c.userId in(这里要是超过15个的话。。) 出来的记录就会显示 34 2010-07-05 9:46:00
您的sql语句不是标准的语句,所以只要读取的不是group by中的字段day(checkTime) ,c.userId 就无法保证一致的结果哈!这也是正常现象!!
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
select c.userid,c.checkTime from checkinout as c
where c.userId in(1,2,3,4,5,6,7,8,9,10,11,12,13,34,15,16,17,1,2,3) and month(checkTime)=7
group by day(c.checkTime) ,c.userId order by c.checkTime asc因为我发现的是userid为34的,5号早上的记录3 2010-07-02 07:58:18
2 2010-07-02 08:02:36
4 2010-07-02 08:10:20
12 2010-07-02 08:29:55
9 2010-07-02 14:47:07
9 2010-07-05 07:41:51
7 2010-07-05 07:41:57
2 2010-07-05 08:12:35
13 2010-07-05 08:23:41
12 2010-07-05 08:23:46
34 2010-07-05 09:42:31
1 2010-07-05 13:54:43
11 2010-07-05 14:29:38
5 2010-07-05 14:32:56
4 2010-07-05 14:38:18
6 2010-07-05 14:43:42
8 2010-07-05 14:47:45
3 2010-07-05 14:49:42
16 2010-07-05 14:54:27
8 2010-07-06 07:30:35
1 2010-07-06 07:33:34但是我一旦修改了之后。。就是里面的in里面后(少于15条)。出来的数据
34号那一天出来的数据就会是34 2010-07-05 07:54:12
我不想说太多。。数据太多。无法向楼上说的些那些create和其他的insert。。
这是项目里面遇见的问题。
select c.userid,c.checkTime from checkinout as c
where c.userId in(1,2,3,4,5,6,7,8,9,10,11,12,13,34,15,16,17)
and month(checkTime)=7
group by day(c.checkTime) ,c.userId order by c.checkTime asc
那里少于15个数字的话。
出来的记录
就会全部正确。。
但是呢。里面大于15个数字的话,比如说 34 2010-07-05 09:42:31就有这一条记录
因为我的表里面有那么两条记录 34 2010-07-05 09:42:31
34 2010-07-05 07:54:12
而我想取的是较早的那一条。。
如果你的需求是这样,你的SQL语句并不保证取的是最早的那一条啊!和IN后面是多少个数字无关。 你的SQL语句只是指定按group by day(checkTime) ,c.userId 分组,对其它字段如何取法没有说明,则MYSQL会自行处理,并不保证是取最大的记录,或者最小的记录。
如果你的需求是分组取最大记录,则可以参考下贴。
http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
[征集]分组取最大N条记录方法征集,及散分....
from (
select * from checkinout as c
where hour(checkTime)<12 and c.userId in(select b.userid from ....)
order by c.checkTime asc
) t
group by day(checkTime) ,c.userId order by c.checkTime asc
恩。上面的意思就是说,我按照userid和天数来分组,忘了说了。我加了个条件进去时year(checkTime)=2010
那么意思就是说,我娶的是2010-7月份的数据,同时也是对userId进行分组,而且后面又是进行升序排序的。那么自然会是取每一天的最小值了。。
里面的值我已经试过好多次了。。只要是超过15个数,,就会取到错误的值。。
额。。
from (
select * from checkinout as c
where hour(checkTime)<12 and c.userId in(select b.userid from ....)
and xxxx = 2010-7月份
order by c.checkTime asc
) t
group by day(checkTime) ,c.userId order by c.checkTime asc