sql >> Database >  >> RDS >> Mysql

Queryresultaten retourneren als een door komma's gescheiden lijst in MySQL

In MySQL kunt u uw zoekopdrachtresultaten retourneren als een door komma's gescheiden lijst met behulp van de GROUP_CONCAT() functie.

De GROUP_CONCAT() functie is speciaal gebouwd met het doel de resultatenset van een zoekopdracht samen te voegen in een lijst, gescheiden door een komma of een scheidingsteken naar keuze.

Dit artikel geeft voorbeelden van hoe het allemaal werkt.

De gegevens

Laten we eerst de volgende gegevens gebruiken in onze eerste paar voorbeelden:

USE Solutions;
SELECT TaskName
FROM Tasks;

Resultaat:

+-------------------+
| TaskName          |
+-------------------+
| Do garden         |
| Feed cats         |
| Paint roof        |
| Take dog for walk |
| Relax             |
| Feed cats         |
+-------------------+

Basisvoorbeeld

Hier is een eenvoudig voorbeeld om de GROUP_CONCAT() . te demonstreren functie:

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

Resultaat:

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

Zoals u kunt zien, is elke rij uit de resultatenset samengevoegd tot één rij. Standaard wordt de lijst gescheiden door een komma.

Houd er rekening mee dat er beperkingen zijn aan hoe lang deze lijst kan zijn. Meer hierover verderop in het artikel.

Voorbeeld – DISTINCT

U kunt DISTINCT . gebruiken om duplicaten te verwijderen (zodat dubbele records één record worden).

Voorbeeld:

SELECT GROUP_CONCAT(DISTINCT TaskName) 
FROM Tasks;

Resultaat:

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

Dus in dit geval wordt 'Katten voeren' maar één keer vermeld, terwijl het in het vorige voorbeeld twee keer werd vermeld.

Voorbeeld – BESTEL DOOR

U kunt ORDER BY . gebruiken om de resultaten op een bepaalde kolom te ordenen.

Voorbeeld:

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

Resultaat:

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

Dus in dit geval gebruik ik DESC om aan te geven dat het in aflopende volgorde moet zijn. De alternatieve (en standaard) waarde is ASC voor oplopend.

Voorbeeld – Geef een scheidingsteken op

Standaard is de lijst een door komma's gescheiden lijst. U kunt desgewenst echter een scheidingsteken naar keuze opgeven.

Gebruik hiervoor SEPARATOR gevolgd door de letterlijke tekenreekswaarde die tussen groepswaarden moet worden ingevoegd.

Voorbeeld:

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

Resultaat:

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

Voorbeeld – Kolommen combineren

U kunt kolommen ook samenvoegen en hun eigen scheidingsteken opgeven door een letterlijke tekenreekswaarde op te geven.

Voorbeeld:

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

Resultaat:

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

In dit voorbeeld retourneren we zowel de TaskId kolom en de TaskName kolom, gescheiden door haakjes en een spatie. We gebruiken ook de SEPARATOR argument om aan te geven dat het scheidingsteken dat tussen elke (aaneengeschakelde) rij moet worden gebruikt een spatie moet zijn (in plaats van de standaardkomma).

Gegroepeerde resultaten

De GROUP_CONCAT() functie kan handig zijn voor gelegenheden waar u een lijst met resultaten wilt geven, gegroepeerd op een andere kolom.

U wilt bijvoorbeeld een lijst met artiesten, met elke artiest gevolgd door een lijst met albums die ze hebben uitgebracht.

Om dit aan te tonen, stel dat we een database hebben met twee tabellen; Artists en Albums . Er is een één-op-veel relatie tussen deze tabellen. Voor elke artiest kunnen er veel albums zijn.

Dus een gewone query die beide tabellen verbindt, kan er ongeveer zo uitzien:

USE Music;
SELECT ar.ArtistName,
	al.AlbumName
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId;

Resultaat:

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

Zoals je kunt zien, wordt bij gebruik van dit formaat, als een artiest meer dan één album heeft, die artiest meerdere keren vermeld - één keer voor elk album.

We zouden deze zoekopdracht zo kunnen aanpassen dat elke artiest maar één keer wordt vermeld. Als een artiest meer dan één album heeft, worden alle albums weergegeven in een enkel veld binnen een door komma's gescheiden lijst. We kunnen dit doen dankzij de GROUP_CONCAT() functie.

Voorbeeld:

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

Resultaat:

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

Wees voorzichtig met de lengte!

Een belangrijk ding waar u op moet letten bij het gebruik van GROUP_CONCAT() is dat het resultaat wordt afgekapt tot de maximale lengte die wordt geleverd door de group_concat_max_len systeemvariabele, die een standaardwaarde heeft van 1024 .

De waarde van deze variabele kan hoger worden ingesteld door de volgende syntaxis te gebruiken:

SET [GLOBAL | SESSION] group_concat_max_len = val;

Waar val is een geheel getal zonder teken.

Houd er echter rekening mee dat de effectieve maximale lengte van de retourwaarde zelf wordt beperkt door de waarde van max_allowed_packet .


  1. Oracle-update loopt vast

  2. MySQL-fout 1449:de gebruiker die is opgegeven als definitie bestaat niet

  3. SQL Server-back-upcontrole

  4. CRUD-bewerking met ASP.NET Core MVC, Entity Framework Core en SQL Server