请教这两个sql语句查询出来的结果为什么不一样

土豆王 2013-05-22 05:40:52

SELECT COUNT(a.uid) AS last_1_2_count FROM
(
SELECT DISTINCT uid,MAX(hfdate) AS max_hfdate,POSITION,checked FROM hrdk.dk_hf GROUP BY uid
) AS a
WHERE (a.max_hfdate BETWEEN UNIX_TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL 2 DAY)) AND UNIX_TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL 1 DAY)))
AND a.position>0 AND a.checked=2

这个结果是:36745
*****************************************************************************

SELECT COUNT(a.uid) AS last_1_2_count FROM
(
SELECT DISTINCT uid,MAX(hfdate) AS max_hfdate,POSITION,checked FROM hrdk.dk_hf WHERE POSITION>0 AND checked=2 GROUP BY uid
HAVING max_hfdate BETWEEN UNIX_TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL 2 DAY)) AND UNIX_TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL 1 DAY))
)
AS a

这个结果是:37067

求大神指导,问题是出在having上吗?
...全文
175 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
土豆王 2013-05-24
  • 打赏
  • 举报
回复
引用 1 楼 ACMAIN_CHM 的回复:
与HAVING无关,注意你的 AND a.position>0 AND a.checked=2 所在的位置不同。 第一个语句中,如果hfdate最大的那条记录不符合 a.position>0 AND a.checked=2 则MAX最大值会与第二条不同。这时第一条取到的max(hfdate)则是 符合 a.position>0 AND a.checked=2 条件的最大值。而这个值不符合max_hfdate BETWEEN UNIX_TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL 2 DAY)) AND UNIX_TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL 1 DAY))条件。
谢谢您的解答,80分就给你了吧,哈哈
WWWWA 2013-05-23
  • 打赏
  • 举报
回复
SELECT DISTINCT uid,MAX(hfdate) AS max_hfdate,POSITION,checked FROM hrdk.dk_hf GROUP BY uid SELECT DISTINCT uid,MAX(hfdate) AS max_hfdate,POSITION,checked FROM hrdk.dk_hf WHERE POSITION>0 AND checked=2 GROUP BY uid HAVING max_hfdate BETWEEN UNIX_TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL 2 DAY)) AND UNIX_TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL 1 DAY)) 这2个SQL语句条件都 不同,结果肯定有差异
rucypli 2013-05-22
  • 打赏
  • 举报
回复
一个先group by 一个后group by 而where过滤条件不是group by的那个字段
ACMAIN_CHM 2013-05-22
  • 打赏
  • 举报
回复
与HAVING无关,注意你的 AND a.position>0 AND a.checked=2 所在的位置不同。 第一个语句中,如果hfdate最大的那条记录不符合 a.position>0 AND a.checked=2 则MAX最大值会与第二条不同。这时第一条取到的max(hfdate)则是 符合 a.position>0 AND a.checked=2 条件的最大值。而这个值不符合max_hfdate BETWEEN UNIX_TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL 2 DAY)) AND UNIX_TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL 1 DAY))条件。

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧