2010-03-01 76 views
4

所以我有这个疑问完美的作品:MySQL JOIN/GROUP_CONCAT第二个表?

SELECT users.*, 
GROUP_CONCAT(categories.category_name) AS categories 
FROM users 
LEFT OUTER JOIN user_categories ON users.user_id = user_categories.user_id 
LEFT OUTER JOIN categories ON user_categories.category_id = categories.category_id 
WHERE users.user_city = 'brooklyn' 
GROUP BY users.user_id 
LIMIT 10; 

说我有保存的电话号码,在“用户”,用户可以有任意数量的另一个电话号码表...我将如何去围绕我正在做的完全相同的事情来分类?换句话说,我希望在“phones”表中找到具有相同“user_id”的所有phone_number,并将它们连接在一起(phone1,phone2,phone3)。我曾尝试过:

SELECT users.*, 
GROUP_CONCAT(phones.phone_number) AS phone_numbers, 
GROUP_CONCAT(categories.category_name) AS categories 
FROM users 
LEFT OUTER JOIN phones ON users.user_id = phones.user_id 
LEFT OUTER JOIN user_categories ON users.user_id = user_categories.user_id 
LEFT OUTER JOIN categories ON user_categories.category_id = categories.category_id 
WHERE users.user_city = 'brooklyn' 
GROUP BY users.user_id 
LIMIT 10; 

没有运气...或至少查询执行,但它做了一些奇怪的重复的事情......任何帮助将是可怕的!

谢谢!

回答

6

它确实很奇怪,因为存在某些行的叉积。您可以使用DISTINCT关键字得到的只有唯一的电话号码:

GROUP_CONCAT(DISTINCT phones.phone_number) AS phone_numbers, 

检查documentation。或者,您可以在另一个查询中获得电话号码,在该查询中,您只需选择具有诸如WHERE phones.user_id IN (x, x, x, ...)(x是从第一个查询返回的ID)的条件的电话号码。

+0

好吧,这个按预期工作......只是想说明,在GROUP_CONCATS中有必要使用DISTINCT – mike 2010-03-01 19:20:24

3

这发生在我身上,后来我不得不改变我的查询。

SELECT 
    (SELECT GROUP_CONCAT(`partnumber`) FROM `product_partnumber` AS `n` WHERE `p`.`id`=`n`.`product_id`) as `partnumbers`, 
    (SELECT GROUP_CONCAT(`oem`) FROM `product_oem` AS `n` WHERE `p`.`id`=`n`.`product_id`) as `oems` 
FROM `product` AS `p` 

所以我不得不使用子查询,否则我有重复。