免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: chutianyin
打印 上一主题 下一主题

关于group by的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-06-06 10:52 |只看该作者
原帖由 chutianyin 于 2006-6-6 10:19 发表
我晕,原来可以这样写
SELECT * FROM `test` group by ccc having count(*)%2=1 and ddd<0



我认为这样写是不真正正确的,也许这个写法正好适合现在的几行数据

论坛徽章:
0
12 [报告]
发表于 2006-06-06 11:23 |只看该作者
原帖由 chutianyin 于 2006-6-6 09:47 发表
select id, ddd, ccc from TB where ddd < 0 and ccc in (select ccc from TB having count(ccc) % 2 = 1) ;
这个也不对 子查询里面未分组 select ccc from TB having count(ccc) % 2 = 1  , count(ccc) 就是 ...

哦,疏忽了。
那么就在 having 前加一个 group by ccc 好了。
不想升级数据库的话,用临时表解决好了。

[ 本帖最后由 rardge 于 2006-6-6 11:25 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2006-06-06 11:49 |只看该作者
原帖由 chutianyin 于 2006-6-6 10:19 发表
我晕,原来可以这样写
SELECT * FROM `test` group by ccc having count(*)%2=1 and ddd<0

呵呵,也许 SELECT * FROM `test` group by ccc having count(*)%2=1 这个和你上面那个结果一样。
根据手册,limit 是最后被执行的,其次是 having,其他的条件比较都在它之前。
而 group by 可能是最先被执行的,having 和它配对使用,相当于提升了其执行优先顺序,所以你这句就变成 SELECT * FROM `test` group by ccc having count(*) % 2 = 1 了,group by 取每个分组的第一条记录,对应你的例子,可能巧合得到正确结果,因为第一条都是负数。
而 ddd < 0 是对前面那个group by 的结果再筛选,如果你用 ddd > 0 那么应该没结果输出了。
换言之,你看你的结果每个分组都是一条记录,如果有一个分组有两条 ddd 为负数的记录,你这个语句就不能得到正确结果。

论坛徽章:
0
14 [报告]
发表于 2006-06-06 13:42 |只看该作者
原帖由 rardge 于 2006-6-6 11:49 发表

呵呵,也许 SELECT * FROM `test` group by ccc having count(*)%2=1 这个和你上面那个结果一样。
根据手册,limit 是最后被执行的,其次是 having,其他的条件比较都在它之前。
而 group by 可能是最先被执行 ...



果然是的。
上面说了不想升级数据库可以用临时表,不知道怎么写,还请指教一下,谢谢!

好像可以这样写
create  temporary  table  tmpName  select  *  from  test group by ccc having count(*)%2=1;
select  *  from  test tmpName where ddd>10;

[ 本帖最后由 chutianyin 于 2006-6-6 13:53 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2006-06-06 14:02 |只看该作者
呵呵,就是用若干条 SQL ,不支持子查询的时候,就是这么做的。

创建一个临时表,CREATE TEMPORARY TABLE  TBName (id ..., ddd ..., ccc ...);
把第一次查询记录送入该表,INSERT INTO TBName SELECT * FROM test GROUP BY ccc HAVING COUNT(ccc) % 2 = 1;
再从临时表做第二次查询,SELECT * FROM TBName WHERE ddd < 0;

临时表你不用去手动删除,在本次会话结束后(就是你的程序断开了和 MySQL 的连接),MySQL 系统会自动把它删除的。而且,在被删除之前你也不会从 show tables 中看到临时表,但却可以从中查询数据。

论坛徽章:
0
16 [报告]
发表于 2006-06-06 14:02 |只看该作者
呵呵,你已经会了。

论坛徽章:
0
17 [报告]
发表于 2006-06-06 15:10 |只看该作者
谢了,此问题已经结贴,不过看来还是尽量的使用高版本的,如果可以用子查询要方便许多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP