MySQL JOIN / GROUP_CONCAT第二个表?

时间:2010-03-01 19:00:59

标签: sql mysql

所以我的查询完美无缺:

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;

假设我有另一个包含电话号码的表格,对于“用户”,用户可以拥有任意数量的电话号码......我将如何围绕完全相同的事情进行操作?换句话说,我想在“电话”表中找到具有相同“user_id”的所有phone_numbers的另一列,并将它们连接在一起(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;

没有运气......或者至少查询执行但它会做一些奇怪的重复事情......任何帮助都会很棒!

谢谢!

2 个答案:

答案 0 :(得分:6)

它确实很奇怪,因为某些行的交叉产品。您可以使用DISTINCT关键字获取唯一的电话号码:

GROUP_CONCAT(DISTINCT phones.phone_number) AS phone_numbers,

检查documentation。或者,您可以在另一个查询中获取电话号码,您只能选择条件为WHERE phones.user_id IN (x, x, x, ...)的电话号码(x是第一个查询返回的ID)。

答案 1 :(得分: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`

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