2013-08-07 3 views
1

I ont un membre de la table avec member_id, member_name, club_name, region, zone, email en tant que champs.groupe mysql group_concat par de multiples champs

J'utilise la fonction MySQL group_concat comme

SELECT group_concat(distinct m.email 
SEPARATOR ', ') from member m group by m.club_name 

Cela fonctionne très bien. Mais je voudrais pouvoir group_concat sur d'autres champs sans créer de requêtes supplémentaires.

Est-il possible de fournir les autres champs en tant que paramètre?

member_id member_name club_name region zone email 
1   member1   A  1 1 [email protected] 
2   member2   A  1 1 [email protected] 
3   member3   B  1 1 [email protected] 
4   member4   C  1 2 [email protected] 
5   member5   D  2 1 [email protected] 

**group by club** 
[email protected],[email protected] 
[email protected] 
[email protected] 
[email protected] 

**group by region** 
[email protected], [email protected], [email protected], [email protected] 
[email protected] 

**group by zone** 
[email protected], [email protected], [email protected] 
[email protected] 

Dites que chaque région a 3 zones, chaque zone a plus d'un club. Maintenant, comment puis-je obtenir des courriels qui peuvent être groupés ou liés à Région, Zone ou Club d'ailleurs?

+1

Veuillez ajouter le jeu de résultats souhaité –

+0

duplication possible de [Multiple GROUP \ _CONCAT sur différents champs en utilisant MySQL] (http://stackoverflow.com/questions/7506750/multiple-group-concat-on-different-fields-using -mysql) – Blazemonger

Répondre

8

Il est difficile de comprendre ce qui êtes-vous après exactement de votre question mais vous pouvez essayer

SELECT club_name, 
     GROUP_CONCAT(DISTINCT email SEPARATOR ', ') emails, 
     GROUP_CONCAT(DISTINCT member_name SEPARATOR ', ') members 
     ... 
FROM member 
GROUP BY club_name 

Exemple de sortie:

 
| CLUB_NAME |        EMAILS |   MEMBERS | 
------------------------------------------------------------------------ 
|  Club1 | [email protected], [email protected], [email protected] | Jhon, Mark, Beth | 
|  Club2 |    [email protected], [email protected] | Helen, Thomas | 

est ici SQLFiddle Démo

Sur un note latérale:fournissant des données d'échantillon et désir ed sortie dans une question comme celle-ci améliore généralement vos changements d'obtenir votre réponse plus rapidement et qui correspond le mieux à vos besoins.

MISE À JOUR: Vous pouvez profondément emballer des informations en utilisant GROUP_CONCAT() en utilisant des séparateurs différents si c'est ce que vous voulez

SELECT 'club' group_type, GROUP_CONCAT(details SEPARATOR '|') details 
    FROM 
(
    SELECT CONCAT(club_name, ';', GROUP_CONCAT(DISTINCT email)) details 
    FROM member 
    GROUP BY club_name 
) a 
UNION ALL 
SELECT 'region' group_type, GROUP_CONCAT(details SEPARATOR '|') details 
    FROM 
(
    SELECT CONCAT(region, ';', GROUP_CONCAT(DISTINCT email)) details 
    FROM member 
    GROUP BY region 
) a 
UNION ALL 
SELECT 'zone' group_type, GROUP_CONCAT(details SEPARATOR '|') details 
    FROM 
(
    SELECT CONCAT(zone, ';', GROUP_CONCAT(DISTINCT email)) details 
    FROM member 
    GROUP BY zone 
) a 

Exemple de sortie:

 
| GROUP_TYPE |                        DETAILS | 
----------------------------------------------------------------------------------------------------------------------- 
|  club | A;[email protected],[email protected]|B;[email protected]|C;[email protected]|D;[email protected] | 
|  region |  1;[email protected],[email protected],[email protected],[email protected]|2;[email protected] | 
|  zone |  1;[email protected],[email protected],[email protected],[email protected]|2;[email protected] | 

est ici SQLFiddle Démo

Si vous utilisez PHP côté client, vous pouvez facilement dérouler la colonne details dans des enregistrements distincts en utilisant explode() pendant que vous itérez le résultat.

+0

J'ai mis l'exemple complet ci-dessus maintenant, ce que je veux exactement. – Joshi

+0

@Pawan Qu'entendez-vous par * ... fournir d'autres champs comme paramètre ... *? Vous pouvez toujours grouper par l'un de ces champs en le spécifiant dans GROUP BY ... Ou vous voulez obtenir des emails groupés par différents champs dans un resultset (une ligne par groupement)? – peterm

+0

Pouvez-vous expliquer comment je peux avoir des courriels regroupés par champs différents dans un ensemble de résultats, c'est-à-dire ce que je veux et ne peux pas voir. bien que cela puisse vous sembler évident. – Joshi