select中的if()函数里如何实现赋值?非常感谢!


set @num = 0;
select sum(if(@num<>id,1&&@num=id,0)) from tb_name; //注:id是字段名,tb_name是表名,@num是变量

我想实现的是:当@num<>id时,if函数返回1同时保存id,否则返回0,最后统计1的个数(也就是不同id的个数)。

问题:在if函数里,如何实现1的返回和@num=id的赋值?


非常感谢大家!

作者: apple749769   发布时间: 2011-05-23

最后统计1的个数(也就是不同id的个数)。

select id,count(*) from tt group by id

就行了

作者: WWWWA   发布时间: 2011-05-23

SET @num:=0;
SET @num1='';
select sum(ss) from (
SELECT *,@num:=IF(@num1<>bh,1,0) AS ss,@num1:=bh AS ss1 FROM tb_name ORDER BY id) a;

作者: WWWWA   发布时间: 2011-05-23

呵呵,感谢WWWWA的回复,这里不能用group by,因为我这只是一个非常大的连接里的一个子查询,在外层已经有很多个group by,若再增加一个对id的group by的话,则对其他sum的数据将产生错误。

所以就产生了这样的问题:若不是用group by进行排重,用count(distinct fields) 这样又需要条件的限制,我这里只好使用变量来保存上一条记录的id,若不相等则sum 1,否则sum 0,但问题是如何将当前id保存进这个变量呢?我无法解决了。。。。

多谢wwwwa的回复,再帮兄弟想想~

作者: apple749769   发布时间: 2011-05-23

SET @num:=0;
SET @num1='';
select sum(ss) from (
SELECT *,@num:=IF(@num1<>id,1,0) AS ss,@num1:=bh AS ss1 FROM tb_name ORDER BY id) a;

or

SELECT COUNT(*) FROM (
SELECT id FROM jzg1 GROUP BY id) a

作者: WWWWA   发布时间: 2011-05-23

引用 3 楼 apple749769 的回复:
呵呵,感谢WWWWA的回复,这里不能用group by,因为我这只是一个非常大的连接里的一个子查询,在外层已经有很多个group by,若再增加一个对id的group by的话,则对其他sum的数据将产生错误。

所以就产生了这样的问题:若不是用group by进行排重,用count(distinct fields) 这样又需要条件的限制,我这里只好使用变量来保存上一条记录的id,若不相等则s……


SET @num:=0;
SET @num1='';
select sum(ss) from (
SELECT *,@num:=IF(@num1<>id,1,0) AS ss,@num1:=bh AS ss1 FROM tb_name ORDER BY id) a;

or

将你的查询存为 VIEW,再分组统计

作者: WWWWA   发布时间: 2011-05-23

SET @num:=0;
SET @num1='';
select sum(ss) from (
SELECT *,@num:=IF(@num1<>id,1,0) AS ss,@num1:=id AS ss1 FROM tb_name ORDER BY id) a;

or

将你的查询存为 VIEW,再分组统计

作者: WWWWA   发布时间: 2011-05-23

sum是一个分组集操作
而@num=id是一项操作,不能同时进行

作者: rucypli   发布时间: 2011-05-23