2009-10-31 28 views
2

比方說,我的DB計劃如下:GROUP_CONCAT和LEFT_JOIN問題 - 不是所有的行返回

T_PRODUCT 
id_product (int, primary) 

two entries: (id_product =1) , (id_product =2) 

T_USER 
id_user (int, primary) 
id_product (int, foreign key) 
name_user (varchar) 

two entries: (id_product=1,name_user='John') , (id_product=1,name_user='Mike') 

如果我跑第一查詢來獲取他們的用戶的所有產品(如果有的話),我得到這個:

SELECT T_PRODUCT.id_product, T_USER.name_user 
FROM T_PRODUCT 
LEFT JOIN T_USER on T_USER.id_product = T_PRODUCT.id_product; 

>> 
id_product name_user 
1   John 
1   Mike 
2   NULL 

看起來不錯。 現在,如果我想同樣的事情,但我想有每行一個產品,具有聯接的用戶名(如果有任何用戶,否則爲NULL):

SELECT T_PRODUCT.id_product, GROUP_CONCAT(T_USER.name_user) 
FROM T_PRODUCT 
LEFT JOIN T_USER on T_USER.id_product = T_PRODUCT.id_product; 

>> 
id_product name_user 
1   John,Mike 

**expected output**: 
id_product name_user 
1   John,Mike 
2   NULL 

如果沒有對用戶一個產品,GROUP_CONCAT可以防止mysql爲這個產品生產一個產品線,即使有一個LEFT JOIN

  1. 這是預期的MySQL行爲嗎?
  2. 有什麼辦法可以使用GROUP_CONCAT或其他函數來獲得預期的輸出嗎?

回答

6

啊,發現我的回答:

GROUP_CONCAT工作時,你不應該忘記GROUP BY子句。 我在第二個查詢中缺少GROUP BY T_PRODUCT.id_product

我會離開這個問題,以防萬一有人像我一樣心不在焉。

編輯

this answer,我想我還可以激活SQL模式ONLY_FULL_GROUP_BY來強制MySQL拋出一個錯誤的情況下,GROUP BY缺失或不正確。

+0

當您離開了一組MySQL不抱怨嗎?我相信T-Sql和Oracle都會這樣做... – jle 2009-10-31 02:42:12

+0

@jle:MySQL對GROUP BY條款設計不嚴格 – 2009-10-31 03:01:58

+2

是的,請參閱http://stackoverflow.com/questions/1645921/mysql-group-by-行爲/ 1646121#1646121 – 2009-10-31 03:05:51

0

另外,還可以使用子查詢,性能

只是測試
SELECT 
    T_PRODUCT.id_product, 
    (SELECT GROUP_CONCAT(T_USER.name_user) 
    FROM T_USER 
    WHERE T_USER.id_product = T_PRODUCT.id_product 
) 
FROM T_PRODUCT