前两天做了个系统,用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

解决方案 »

  1.   

    1、SQL语句不是标准的;
    2、贴记录及要求结果出来看看
      

  2.   

    楼上的,谢谢回帖。大概的意思就是那样。。要是说里面我改一下就是因为别名我没有用c.userId这之类的
    。出来的结果比如说我在c.userid in(34)这样的话就会取到有一条记录是 34 2010-07-05 7:45:30的记录
    但是要是c.userId in(这里要是超过15个的话。。) 出来的记录就会显示 34 2010-07-05 9:46:00
    所以我觉得很奇怪。。
    我反复测试了许多遍了
      

  3.   

    这样试试
    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
      

  4.   

    楼上的。谢谢你。
    因为我要取的的checktime的具体值的。。所以
      

  5.   

    要是说里面我改一下就是因为别名我没有用c.userId这之类的
    。出来的结果比如说我在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 就无法保证一致的结果哈!这也是正常现象!!
      

  6.   

    同意,早就说过,sql语句不是标准的语句,结果是未知的
      

  7.   


       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式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)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  8.   

    好了。。楼上的。。没有回答我的问题。我知道问题出在哪里了。。我在别的版区问的问题。
    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。。
    这是项目里面遇见的问题。
      

  9.   

    就是说只要
    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
    而我想取的是较早的那一条。。
      

  10.   


    如果你的需求是这样,你的SQL语句并不保证取的是最早的那一条啊!和IN后面是多少个数字无关。 你的SQL语句只是指定按group by day(checkTime) ,c.userId 分组,对其它字段如何取法没有说明,则MYSQL会自行处理,并不保证是取最大的记录,或者最小的记录。
    如果你的需求是分组取最大记录,则可以参考下贴。
    http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
    [征集]分组取最大N条记录方法征集,及散分....
      

  11.   

    select *
    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
      

  12.   

    ACMAIN_CHM,首先真的谢谢你的耐心,
    恩。上面的意思就是说,我按照userid和天数来分组,忘了说了。我加了个条件进去时year(checkTime)=2010
    那么意思就是说,我娶的是2010-7月份的数据,同时也是对userId进行分组,而且后面又是进行升序排序的。那么自然会是取每一天的最小值了。。
    里面的值我已经试过好多次了。。只要是超过15个数,,就会取到错误的值。。
    额。。
      

  13.   

    记住,你是先分组再排序的。所以这个排序对记录选中根本没有影响。select *
    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