sql >> Database >  >> RDS >> Mysql

GROUP_CONCAT() Functie in MySQL

MySQL heeft een GROUP_CONCAT() functie waarmee we kolommen uit een query kunnen retourneren als een begrensde lijst.

Het retourneert een tekenreeksresultaat met de aaneengeschakelde niet-NULL waarden van een groep.

Syntaxis

De syntaxis gaat als volgt:

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

Voorbeeld

Stel dat we de volgende query uitvoeren:

SELECT PetName 
FROM Pets;

En we krijgen het volgende resultaat:

+---------+
| PetName |
+---------+
| Fluffy  |
| Fetch   |
| Scratch |
| Wag     |
| Tweet   |
| Fluffy  |
| Bark    |
| Meow    |
+---------+
8 rows in set (0.00 sec)

We kunnen GROUP_CONCAT() . gebruiken om al die rijen terug te geven als een lijst met scheidingstekens.

Om dit te doen, moeten we de PetName . doorgeven kolom als argument voor de GROUP_CONCAT() functie:

SELECT GROUP_CONCAT(PetName) 
FROM Pets;

Resultaat:

+-------------------------------------------------+
| GROUP_CONCAT(PetName)                           |
+-------------------------------------------------+
| Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow |
+-------------------------------------------------+
1 row in set (0.01 sec)

Bestellen

We kunnen de ORDER BY . gebruiken clausule om de uitvoer van deze functie te bestellen:

SELECT GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets;

Resultaat:

Bark,Fetch,Fluffy,Fluffy,Meow,Scratch,Tweet,Wag

Merk op dat dit alleen de uitvoer van de GROUP_CONCAT() . sorteert functie – het is volledig onafhankelijk van elke volgorde die wordt toegepast op de SELECT verklaring zelf.

De DISTINCT Clausule

We kunnen de DISTINCT . gebruiken clausule om unieke waarden te retourneren. Met andere woorden, als er dubbele waarden zijn, wordt slechts één exemplaar geretourneerd:

SELECT GROUP_CONCAT(DISTINCT PetName ORDER BY PetName ASC)
FROM Pets;

Resultaat:

Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag

In dit geval Fluffy verschijnt maar één keer. Wanneer we het uitvoeren zonder de DISTINCT clausule, Fluffy verschijnt twee keer.

Het scheidingsteken wijzigen

Standaard gebruikt de lijst de komma als scheidingsteken. Maar we kunnen dit veranderen als we willen:

SELECT GROUP_CONCAT(PetName SEPARATOR '-')
FROM Pets;

Resultaat:

Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow

We kunnen zelfs een lege string gebruiken om alle scheidingstekens te verwijderen (zodat de waarden aaneengeschakeld worden):

SELECT GROUP_CONCAT(PetName SEPARATOR '')
FROM Pets;

En we krijgen het volgende resultaat:

FluffyFetchScratchWagTweetFluffyBarkMeow

Gegroepeerde zoekopdrachtresultaten

We kunnen GROUP_CONCAT() . opnemen in een zoekopdracht met een GROUP BY clausule om een ​​resultaat als dit te bereiken:

SELECT 
    PetTypeId,
    GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets
GROUP BY PetTypeId
ORDER BY PetTypeId;

Resultaat:

+-----------+--------------------------------------------+
| PetTypeId | GROUP_CONCAT(PetName ORDER BY PetName ASC) |
+-----------+--------------------------------------------+
|         1 | Tweet                                      |
|         2 | Fluffy,Meow,Scratch                        |
|         3 | Bark,Fetch,Fluffy,Wag                      |
+-----------+--------------------------------------------+

In mijn database staan ​​de daadwerkelijke namen van huisdiertypes in een andere tabel genaamd PetTypes . We zouden daarom een ​​INNER JOIN . kunnen uitvoeren op de PetTypes tabel om de werkelijke namen van huisdiertypes te krijgen:

SELECT 
    pt.PetType,
    GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC)
FROM Pets p
INNER JOIN PetTypes pt ON
p.PetTypeId = pt.PetTypeId
GROUP BY pt.PetType
ORDER BY pt.PetType ASC;

Resultaat:

+---------+------------------------------------------------+
| PetType | GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC) |
+---------+------------------------------------------------+
| Bird    | Tweet                                          |
| Cat     | Fluffy,Meow,Scratch                            |
| Dog     | Bark,Fetch,Fluffy,Wag                          |
+---------+------------------------------------------------+

Lengtebeperkingen

GROUP_CONCAT() 's output wordt afgekapt tot de maximale lengte die wordt gegeven door de group_concat_max_len systeemvariabele, die een standaardwaarde heeft van 1024 . De waarde kan hoger worden ingesteld, hoewel de effectieve maximale lengte van de retourwaarde wordt beperkt door de waarde van max_allowed_packet .

U kunt de huidige waarde als volgt controleren:

SHOW VARIABLES LIKE '%group_concat%';

De syntaxis voor het wijzigen van deze waarde gaat als volgt:

SET [GLOBAL | SESSION] group_concat_max_len = val;

Waar val is een geheel getal zonder teken.


  1. Vind de op één na hoogste salaris best mogelijke manieren

  2. PostgreSQL-functieaanroep

  3. Fout bij het maken van tabel:u heeft een fout in uw SQL-syntaxis in de buurt van 'order( order_id INT UNSIGNED NOT NULL AUTO_INCREMENT, user_id ' op regel 1

  4. Haal de id van de ingevoegde rij op met C#