Risultati MySQL come elenco separato da virgole


129

Devo eseguire una query come:

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

Ma vorrei che la sottoselezione restituisse un elenco separato da virgole, anziché una colonna di dati. È anche possibile, e se sì, come?

Risposte:


250

È possibile utilizzare GROUP_CONCAT per eseguire ciò, ad esempio qualcosa del genere

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
Inoltre, tieni presente che se stai usando PHPMyAdmin e vuoi produrre un elenco delimitato da virgole sulla pagina, usa GROUP_CONCAT(CAST(s.name AS CHAR))oppure restituirà qualcosa di totalmente inutile come[BLOB - 20 Bytes] .
devios1

3
L'intento va bene e MySQL lo permetterà, ma fai attenzione (in generale) al tuo utilizzo di GROUP BY. Gli elementi nell'elenco di selezione devono essere aggregati validi nel contesto della clausola GROUP BY. In questo caso, p.name non è strettamente valido. Qualsiasi database conforme allo standard SQL lo considererà un errore. In questo caso, utilizzare MAX (p.name) nell'elenco di selezione o aggiungere p.name alla clausola GROUP BY. Poiché Paul probabilmente significa che p.id rappresenta una chiave primaria o unica, l'aggiunta di p.name alla clausola GROUP BY non avrà alcun impatto sul risultato finale.
Jon Armstrong - Xgc

Nota Potrebbe essere necessario impostare la lunghezza massima per la sessione per stackoverflow.com/questions/2567000/...
sobelito

Grazie mille! Mi hai aiutato molto!
André Agostinho,

11

Invece di usare group concat()puoi usare soloconcat()

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

modifica questo funziona solo in mySQL; Oracle concat accetta solo due argomenti. In Oracle puoi usare qualcosa come select col1 || ',' || col2 || ',' || col3 come foobar dalla tabella1; in SQL Server useresti + invece di pipe.


2
Questo non dovrebbe funzionare nel caso GROUP BY, mentre GROUP_CONCAT () concatenerà i contenuti di una singola colonna
Aram Paronikyan,

5

Ora solo io mi sono imbattuto in questa situazione e ho trovato alcune caratteristiche più interessanti in giro GROUP_CONCAT. Spero che questi dettagli ti facciano sentire interessante.

semplice GROUP_CONCAT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

Risultato:

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

GROUP_CONCAT con DISTINCT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

Risultato:

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

GROUP_CONCAT con DISTINCT e ORDER BY

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

Risultato:

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

GROUP_CONCAT con DISTINCT e SEPARATOR

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

Risultato:

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

GROUP_CONCAT e colonne combinate

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

Risultato:

+------------------------------------------------------------------------------------+
| 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 e Risultati raggruppati Si supponga che i seguenti siano i risultati prima dell'usoGROUP_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;

Risultato:

+------------------------+----------------------------------------------------------------------------+
| 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                       |
+------------------------+----------------------------------------------------------------------------+

3

Nel mio caso devo concatenare tutto il numero di conto di una persona il cui numero di cellulare è unico. Quindi ho usato la seguente query per raggiungere questo obiettivo.

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

Il risultato della query è di seguito:

Accounts
93348001,97530801,93348001,97530801
89663501
62630701
6227895144840002
60070021
60070020
60070019
60070018
60070017
60070016
60070015
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.