Mysql GROUP BY NULL

最近在Mysql发现一个问题,当我们如果使用GROUP BY如果出现NULL值,MYSQL会怎样处理。而且如果我需要把每个NULL值都打印出来而不是分组,那该怎么办?


下面我们做个试验:


[sql]  view plain  copy
  1. CREATE TABLE IF NOT EXISTS A(id INT PRIMARY KEY AUTO_INCREMENT ,NAME VARCHAR(10)) ;  
  2. CREATE TABLE IF NOT EXISTS B(id INT PRIMARY KEY AUTO_INCREMENT ,NAME VARCHAR(10) ,aid INT NOT NULL) ;  
  3.   
  4. INSERT INTO A(NAMEVALUES('a') ;  
  5. INSERT INTO A(NAMEVALUES('a') ;  
  6. INSERT INTO A(NAMEVALUES('a') ;  
  7. INSERT INTO A(NAMEVALUES('a') ;  
  8. INSERT INTO A(NAMEVALUES('b') ;  
  9. INSERT INTO A(NAMEVALUES('b') ;  
  10. INSERT INTO A(NAMEVALUES('a') ;  
  11. INSERT INTO A(NAMEVALUES('a') ;  
  12. INSERT INTO A(NAMEVALUES('b') ;  
  13. INSERT INTO A(NAMEVALUES('a') ;  
  14. INSERT INTO A(NAMEVALUES('b') ;  
  15. INSERT INTO A(NAMEVALUES('a') ;  
  16.   
  17. INSERT INTO B(NAME ,aid) VALUES('d' , 3) ;  
  18. INSERT INTO B(NAME ,aid) VALUES('f' , 5) ;  
  19. INSERT INTO B(NAME ,aid) VALUES('f' , 6) ;  
  20. INSERT INTO B(NAME ,aid) VALUES('f' , 7) ;  
  21. INSERT INTO B(NAME ,aid) VALUES('d' , 8) ;  

结果:

      


我们用GROUP BY 在A表查询,以name作为分组,比如:

SELECT a.name FROM A GROUP BY a.`name` ;

结果:



然后我们使用连接查询:


[sql]  view plain  copy
  1. SELECT a.id ,a.name ,b.name FROM A a   
  2. LEFT JOIN B b  
  3. ON(a.id = b.aid) ;  

结果:


但我们现在需要用GROUP对上面的进行查询:


[sql]  view plain  copy
  1. SELECT a.id ,a.name ,b.name FROM A a   
  2. LEFT JOIN B b  
  3. ON(a.id = b.aid) GROUP BY b.name;  

结果



从上面可以看出,当group by这列有null值时,group会把他们当成是同一个直接聚合。


但我现在需要把b.name=NULL的情况都查询出来,而不是聚合,那么怎么办?


后来在网上:http://stackoverflow.com/questions/4588935/group-by-do-not-group-null找到了方法。


我们可以使用一个UUID来对null值进行转换,这样每个b.name=null的行都会被查询出来而不是被分到同一组。


对于UUID我们可以查询MYSQL的技术文档http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid


下面来尝试下:

[sql]  view plain  copy
  1. #--增加一个UUID(),把b.name的NULL的值都转化为具有专一性的uuid,这样每个b.name都会不同,GROUP就不会对他们进行分组  
  2. SELECT a.id ,a.name ,b.name FROM A a   
  3. LEFT JOIN B b  
  4. ON(a.id = b.aid)   
  5. GROUP BY IFNULL(b.name,UUID());  

运行结果:



这样可以实现Mysql Group by NULL值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值