Mysql GROUP BY NULL

最近在Mysql發現一個問題,當我們如果使用GROUP BY如果出現NULL值,MYSQL會怎樣處理。而且如果我需要把每個NULL值都打印出來而不是分組,那該怎麼辦?


下面我們做個試驗:


CREATE TABLE IF NOT EXISTS A(id INT PRIMARY KEY AUTO_INCREMENT ,NAME VARCHAR(10)) ;
CREATE TABLE IF NOT EXISTS B(id INT PRIMARY KEY AUTO_INCREMENT ,NAME VARCHAR(10) ,aid INT NOT NULL) ;

INSERT INTO A(NAME) VALUES('a') ;
INSERT INTO A(NAME) VALUES('a') ;
INSERT INTO A(NAME) VALUES('a') ;
INSERT INTO A(NAME) VALUES('a') ;
INSERT INTO A(NAME) VALUES('b') ;
INSERT INTO A(NAME) VALUES('b') ;
INSERT INTO A(NAME) VALUES('a') ;
INSERT INTO A(NAME) VALUES('a') ;
INSERT INTO A(NAME) VALUES('b') ;
INSERT INTO A(NAME) VALUES('a') ;
INSERT INTO A(NAME) VALUES('b') ;
INSERT INTO A(NAME) VALUES('a') ;

INSERT INTO B(NAME ,aid) VALUES('d' , 3) ;
INSERT INTO B(NAME ,aid) VALUES('f' , 5) ;
INSERT INTO B(NAME ,aid) VALUES('f' , 6) ;
INSERT INTO B(NAME ,aid) VALUES('f' , 7) ;
INSERT INTO B(NAME ,aid) VALUES('d' , 8) ;

結果:

      


我們用GROUP BY 在A表查詢,以name作爲分組,比如:

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

結果:



然後我們使用連接查詢:


SELECT a.id ,a.name ,b.name FROM A a 
LEFT JOIN B b
ON(a.id = b.aid) ;

結果:


但我們現在需要用GROUP對上面的進行查詢:


SELECT a.id ,a.name ,b.name FROM A a 
LEFT JOIN B b
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


下面來嘗試下:

#--增加一個UUID(),把b.name的NULL的值都轉化爲具有專一性的uuid,這樣每個b.name都會不同,GROUP就不會對他們進行分組
SELECT a.id ,a.name ,b.name FROM A a 
LEFT JOIN B b
ON(a.id = b.aid) 
GROUP BY IFNULL(b.name,UUID());

運行結果:



這樣可以實現Mysql Group by NULL值。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章