SELECT A_id, IF(A_status = 'OK', A_date, 0) as date
FROM A 
GROUP BY A_id
HAVING COUNT(1) >= 2 AND MAX(date) < CURDATE() AND MAX(date) != 0如上假设A表有A_id,A_status,A_date三个字段
这种写法是对的吗
意图是找出以A_id分组,A_date最大的那条记录中,A_date小于今天且A_status=‘OK’

解决方案 »

  1.   


    改成这样试试;select *
    from 
    (
    SELECT A_id, IF(A_status = 'OK', A_date, 0) as date
    FROM A 
    GROUP BY A_id
    HAVING COUNT(1) >= 2 
    )A
    where  MAX(date) < CURDATE() ANDdate != 0
      

  2.   


    group by之后建一张临时表 一个id就只对应一条记录 那max还有什么意义?
      

  3.   


    group by之后建一张临时表 一个id就只对应一条记录 那max还有什么意义?上面写错了要把max去掉,实际上having就是对于group by时候,进行过滤数据,和where是一样的。你试试把你写的代码,和我上面的代码,运行,看看结果是否一样?
      

  4.   


    group by之后建一张临时表 一个id就只对应一条记录 那max还有什么意义?上面写错了要把max去掉,实际上having就是对于group by时候,进行过滤数据,和where是一样的。你试试把你写的代码,和我上面的代码,运行,看看结果是否一样?
    结果是一样的 但是里面存在错误结果 我也不知道为什么
      

  5.   


    group by之后建一张临时表 一个id就只对应一条记录 那max还有什么意义?上面写错了要把max去掉,实际上having就是对于group by时候,进行过滤数据,和where是一样的。你试试把你写的代码,和我上面的代码,运行,看看结果是否一样?
    结果是一样的 但是里面存在错误结果 我也不知道为什么那可能是因为mysql的语法比较特殊,因为一般的group by语法, IF(A_status = 'OK', A_date, 0) as date肯定会报错,但是在mysql中是不会报错的,所以问题的关键就是 这个  IF(A_status = 'OK', A_date, 0) as date,这个值是随机出来的值,你加上max试试
      

  6.   


    group by之后建一张临时表 一个id就只对应一条记录 那max还有什么意义?上面写错了要把max去掉,实际上having就是对于group by时候,进行过滤数据,和where是一样的。你试试把你写的代码,和我上面的代码,运行,看看结果是否一样?
    结果是一样的 但是里面存在错误结果 我也不知道为什么那可能是因为mysql的语法比较特殊,因为一般的group by语法, IF(A_status = 'OK', A_date, 0) as date肯定会报错,但是在mysql中是不会报错的,所以问题的关键就是 这个  IF(A_status = 'OK', A_date, 0) as date,这个值是随机出来的值,你加上max试试好像可以这样:SELECT A_id
    FROM A 
    GROUP BY A_id
    HAVING COUNT(1) >= 2 AND MAX(date) < CURDATE() AND MAX(IF(A_status = 'OK', A_date, 0) ) = MAX(date) 
      

  7.   

    SELECT A_id, max(A_date) as date
    FROM A 
    GROUP BY A_id
    HAVING MAX(date) < CURDATE() AND A_status='OK';