最近在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值。