sql >> Databasteknik >  >> RDS >> MariaDB

MariaDB GROUP_CONCAT()

MariaDB har en GROUP_CONCAT() funktion som gör att vi kan returnera kolumner från en fråga som en avgränsad lista.

Syntax

Syntaxen ser ut så här:

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}])

Exempel

Anta att vi kör följande fråga:

SELECT PetName 
FROM Pets;

Och vi får följande resultat:

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

Vi kan använda GROUP_CONCAT() för att returnera alla dessa rader som en avgränsad lista.

För att uppnå detta behöver vi bara skicka PetName kolumnen som ett argument till GROUP_CONCAT() funktion:

SELECT GROUP_CONCAT(PetName) 
FROM Pets;

Resultat:

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

Beställer

Vi kan använda ORDER BY sats för att beställa utgången av denna funktion:

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

Resultat:

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

Observera att detta bara sorterar utdata från GROUP_CONCAT() funktion – den är helt oberoende av eventuell ordning som tillämpas på SELECT själva uttalandet.

Begränsa utdata

Vi kan använda LIMIT klausul för att begränsa hur många objekt som ingår i listan:

SELECT GROUP_CONCAT(PetName LIMIT 3)
FROM Pets;

Resultat:

Fluffy,Fetch,Scratch

Alla beställningar tillämpas före LIMIT klausul:

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

Resultat:

Wag,Tweet,Scratch

Observera att LIMIT sats stöds endast från MariaDB 10.3.3.

DISTINCT Klausul

Vi kan använda DISTINCT klausul för att returnera unika värden. Med andra ord, om det finns dubbletter av värden, returneras endast en förekomst:

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

Resultat:

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

I det här fallet, Fluffy visas bara en gång. När vi kör det utan DISTINCT klausul, Fluffy visas två gånger.

Ändra avskiljaren

Som standard använder listan kommatecken som avgränsare. Men vi kan ändra detta om vi vill:

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

Resultat:

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

Vi kan till och med använda en tom sträng för att ta bort alla avgränsare (så att värdena sammanfogas):

SELECT GROUP_CONCAT(PetName SEPARATOR '')
FROM Pets;

Och vi får följande resultat:

FluffyFetchScratchWagTweetFluffyBarkMeow

Grupperade frågeresultat

Vi kan inkludera GROUP_CONCAT() i en fråga med en GROUP BY klausul för att uppnå ett resultat som detta:

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

Resultat:

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

I min databas finns de faktiska husdjurstypnamnen i en annan tabell som heter PetTypes . Vi kunde därför köra en INNER JOINPetTypes tabell för att få de faktiska husdjurstypnamnen:

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;

Resultat:

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

Längdbegränsningar

Den maximala returnerade längden i byte bestäms av group_concat_max_len serversystemvariabel, som är standard på 1M (i MariaDB 10.2.4 och högre) eller 1K (i MariaDB 10.2.3 och lägre). Om group_concat_max_len är 512 eller lägre, returtypen är VARBINARY eller VARCHAR; annars är returtypen BLOB eller TEXT . Valet mellan binära eller icke-binära typer beror på inmatningen.

Du kan kontrollera det aktuella värdet så här:

SHOW VARIABLES LIKE '%group_concat%';

Syntaxen för att ändra detta värde ser ut som följer:

SET [GLOBAL | SESSION] group_concat_max_len = val;

Där val är ett heltal utan tecken.


  1. Vilken MySQL-datatyp som ska användas för att lagra booleska värden

  2. Dataklassificering i IRI Workbench

  3. ORA-30926:kan inte få en stabil uppsättning rader i källtabellerna när tabeller slås samman

  4. Lägg till datumparameter till Oracle-frågan