142 votes

Résultats MySQL sous forme de liste séparée par des virgules

J'ai besoin d'exécuter une requête comme :

SELECT p.id, p.name, 
       (SELECT name 
          FROM sites s 
         WHERE s.id = p.site_id) AS site_list
  FROM publications p

Mais j'aimerais que la sous-sélection renvoie une liste séparée par des virgules, au lieu d'une colonne de données. Est-ce possible, et si oui, comment ?

272voto

Paul Dixon Points 122033

Vous pouvez utiliser GROUPE_CONCAT pour effectuer cela, par exemple quelque chose comme

SELECT p.id, p.name, GROUP_CONCAT(s.name) AS site_list
FROM sites s
INNER JOIN publications p ON(s.id = p.site_id)
GROUP BY p.id, p.name;

10 votes

Par ailleurs, si vous utilisez PHPMyAdmin et que vous souhaitez afficher une liste délimitée par des virgules sur la page, utilisez la fonction GROUP_CONCAT(CAST(s.name AS CHAR)) ou bien il retournera quelque chose de totalement inutile comme [BLOB - 20 Bytes] .

3 votes

L'intention est bonne et MySQL l'autorise, mais soyez prudent (en général) avec votre utilisation de GROUP BY. Les éléments de la liste de sélection doivent être des agrégats valides dans le contexte de la clause GROUP BY. Dans ce cas, p.name n'est pas strictement valide. Toute base de données conforme à la norme SQL traitera cette erreur. Dans ce cas, il faut soit utiliser MAX(p.name) dans la liste de sélection, soit ajouter p.name à la clause GROUP BY. Comme Paul veut probablement que p.id représente une clé primaire ou unique, l'ajout de p.name à la clause GROUP BY n'aura aucun impact sur le résultat final.

0 votes

Remarque : il se peut que vous deviez définir la durée maximale de chaque session. stackoverflow.com/questions/2567000/

22voto

Ganesh Points 106

Il n'y a que moi qui ai rencontré cette situation et qui ai trouvé des fonctionnalités plus intéressantes autour de moi. GROUP_CONCAT . J'espère que ces détails vous rendront intéressant.

simple GROUP_CONCAT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

Résultat :

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

GROUP_CONCAT avec DISTINCT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

Résultat :

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

GROUP_CONCAT avec DISTINCT et ORDER BY

SELECT GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) 
FROM Tasks;

Résultat :

+--------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) |
+--------------------------------------------------------+
| Take dog for walk,Relax,Paint roof,Feed cats,Do garden |
+--------------------------------------------------------+

GROUP_CONCAT avec DISTINCT et SEPARATOR

SELECT GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') 
FROM Tasks;

Résultat :

+----------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ')                |
+----------------------------------------------------------------+
| Do garden + Feed cats + Paint roof + Relax + Take dog for walk |
+----------------------------------------------------------------+

GROUP_CONCAT et combinaison de colonnes

SELECT GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') 
FROM Tasks;

Résultat :

+------------------------------------------------------------------------------------+
| GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ')                                 |
+------------------------------------------------------------------------------------+
| 1) Do garden 2) Feed cats 3) Paint roof 4) Take dog for walk 5) Relax 6) Feed cats |
+------------------------------------------------------------------------------------+

GROUP_CONCAT et résultats groupés Supposons que les résultats suivants soient obtenus avant d'utiliser GROUP_CONCAT

+------------------------+--------------------------+
| ArtistName             | AlbumName                |
+------------------------+--------------------------+
| Iron Maiden            | Powerslave               |
| AC/DC                  | Powerage                 |
| Jim Reeves             | Singing Down the Lane    |
| Devin Townsend         | Ziltoid the Omniscient   |
| Devin Townsend         | Casualties of Cool       |
| Devin Townsend         | Epicloud                 |
| Iron Maiden            | Somewhere in Time        |
| Iron Maiden            | Piece of Mind            |
| Iron Maiden            | Killers                  |
| Iron Maiden            | No Prayer for the Dying  |
| The Script             | No Sound Without Silence |
| Buddy Rich             | Big Swing Face           |
| Michael Learns to Rock | Blue Night               |
| Michael Learns to Rock | Eternity                 |
| Michael Learns to Rock | Scandinavia              |
| Tom Jones              | Long Lost Suitcase       |
| Tom Jones              | Praise and Blame         |
| Tom Jones              | Along Came Jones         |
| Allan Holdsworth       | All Night Wrong          |
| Allan Holdsworth       | The Sixteen Men of Tain  |
+------------------------+--------------------------+

USE Music;
SELECT ar.ArtistName,
    GROUP_CONCAT(al.AlbumName)
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
GROUP BY ArtistName;

Résultat :

+------------------------+----------------------------------------------------------------------------+
| ArtistName             | GROUP_CONCAT(al.AlbumName)                                                 |
+------------------------+----------------------------------------------------------------------------+
| AC/DC                  | Powerage                                                                   |
| Allan Holdsworth       | All Night Wrong,The Sixteen Men of Tain                                    |
| Buddy Rich             | Big Swing Face                                                             |
| Devin Townsend         | Epicloud,Ziltoid the Omniscient,Casualties of Cool                         |
| Iron Maiden            | Somewhere in Time,Piece of Mind,Powerslave,Killers,No Prayer for the Dying |
| Jim Reeves             | Singing Down the Lane                                                      |
| Michael Learns to Rock | Eternity,Scandinavia,Blue Night                                            |
| The Script             | No Sound Without Silence                                                   |
| Tom Jones              | Long Lost Suitcase,Praise and Blame,Along Came Jones                       |
+------------------------+----------------------------------------------------------------------------+

12voto

Robert Quinn Points 129

Au lieu d'utiliser group concat() vous pouvez utiliser seulement concat()

Select concat(Col1, ',', Col2) as Foo_Bar from Table1;

modifier cela ne fonctionne que dans mySQL ; Oracle concat n'accepte que deux arguments. Dans oracle vous pouvez utiliser quelque chose comme select col1||','||col2||','||col3 as foobar from table1 ; dans sql server vous utiliseriez + au lieu de pipes.

2 votes

Cela ne devrait pas fonctionner dans le cas de GROUP BY, alors que GROUP_CONCAT() concaténera le contenu d'une seule colonne.

3voto

Dans mon cas, je dois concaténer tous les numéros de compte d'une personne dont le numéro de mobile est unique. J'ai donc utilisé la requête suivante pour y parvenir.

SELECT GROUP_CONCAT(AccountsNo) as Accounts FROM `tblaccounts` GROUP BY MobileNumber

Le résultat de la requête est ci-dessous :

Accounts
93348001,97530801,93348001,97530801
89663501
62630701
6227895144840002
60070021
60070020
60070019
60070018
60070017
60070016
60070015

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X