sql >> Database >  >> RDS >> MariaDB

MariaDB GROUP_CONCAT()

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

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]
             [LIMIT {[offset,] row_count | row_count OFFSET offset}])

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.001 sec)

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

Om dit te bereiken, hoeven we alleen de PetName . door te geven 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.003 sec)

Bestellen

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

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

Resultaat:

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

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 uitvoer beperken

We kunnen de LIMIT . gebruiken clausule om het aantal items in de lijst te beperken:

SELECT GROUP_CONCAT(PetName LIMIT 3)
FROM Pets;

Resultaat:

Fluffy,Fetch,Scratch

Elke bestelling wordt toegepast vóór de LIMIT clausule:

SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC LIMIT 3)
FROM Pets;

Resultaat:

Wag,Tweet,Scratch

Merk op dat de LIMIT clausule wordt alleen ondersteund vanuit MariaDB 10.3.3.

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

De maximale geretourneerde lengte in bytes wordt bepaald door de group_concat_max_len serversysteemvariabele, die standaard is ingesteld op 1M (in MariaDB 10.2.4 en hoger) of 1K (in MariaDB 10.2.3 en lager). Als group_concat_max_len is 512 of lager, het retourtype is VARBINARY of VARCHAR; anders is het retourtype BLOB of TEXT . De keuze tussen binaire of niet-binaire typen hangt af van de invoer.

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. SQL Server-gegevens invoegen met Oracle® SQL*Loader

  2. Een gegevensmodel voor de marathontraining-app

  3. Nieuwe Oracle-compatibiliteitsfuncties in PostgresPlus Advanced Server 9.3Beta

  4. Wat is er nieuw in Access 2016? Is het de moeite waard om te upgraden?