2010-03-01 8 views
4

J'ai donc cette requête qui fonctionne parfaitement:MySQL JOIN/GROUP_CONCAT deuxième table?

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; 

Dire que j'ai une autre table qui contient les numéros de téléphone, pour les « utilisateurs », un utilisateur peut avoir un certain nombre de numéros de téléphone ... Comment pourrais-je aller sur faire autour de la même chose que je fais avec les catégories? En d'autres termes, je voudrais obtenir une autre colonne avec TOUS les phone_numbers trouvés dans la table "phones" qui ont le même "user_id" et les concaténer ensemble (phone1, phone2, phone3)? J'ai essayé:

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; 

Avec pas de chance ... ou tout au moins la requête exécute mais il fait quelque chose de duplication bizarre ... toute aide serait génial!

Merci!

Répondre

6

Il fait des choses étranges, car il y a un produit croisé de certaines lignes. Vous pouvez utiliser le mot-clé DISTINCT pour obtenir que les numéros de téléphone uniques:

GROUP_CONCAT(DISTINCT phones.phone_number) AS phone_numbers, 

Vérifiez la documentation. Alternativement, vous pouvez obtenir les numéros de téléphone dans une autre requête où vous ne sélectionneriez que les numéros de téléphone avec une condition comme WHERE phones.user_id IN (x, x, x, ...) (x sont des ID retournés à partir de la première requête).

+0

Ok, cela fonctionne comme prévu ... Je voulais juste noter qu'il est nécessaire d'utiliser DISTINCT dans les deux GROUP_CONCATS – mike

3

Cela m'est arrivé, j'ai plus tard dû modifier ma requête à cela.

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` 

J'ai donc dû utiliser des sous-requêtes sinon j'ai eu la duplication.

Questions connexes