sql >> Databáze >  >> RDS >> MariaDB

MariaDB GROUP_CONCAT()

MariaDB má GROUP_CONCAT() funkce, která nám umožňuje vrátit sloupce z dotazu jako oddělovaný seznam.

Syntaxe

Syntaxe vypadá takto:

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

Příklad

Předpokládejme, že spustíme následující dotaz:

SELECT PetName 
FROM Pets;

A dostaneme následující výsledek:

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

Můžeme použít GROUP_CONCAT() vrátit všechny tyto řádky jako seznam s oddělovači.

Abychom toho dosáhli, vše, co musíme udělat, je předat PetName sloupec jako argument pro GROUP_CONCAT() funkce:

SELECT GROUP_CONCAT(PetName) 
FROM Pets;

Výsledek:

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

Objednávání

Můžeme použít ORDER BY klauzule k objednání výstupu této funkce:

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

Výsledek:

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

Všimněte si, že toto třídí pouze výstup GROUP_CONCAT() funkce – je zcela nezávislá na jakémkoli řazení použitém na SELECT samotné prohlášení.

Omezení výstupu

Můžeme použít LIMIT klauzule omezující počet položek zahrnutých v seznamu:

SELECT GROUP_CONCAT(PetName LIMIT 3)
FROM Pets;

Výsledek:

Fluffy,Fetch,Scratch

Jakákoli objednávka se použije před LIMIT klauzule:

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

Výsledek:

Wag,Tweet,Scratch

Všimněte si, že LIMIT klauzule je podporována pouze od MariaDB 10.3.3.

DISTINCT Ustanovení

Můžeme použít DISTINCT klauzule pro vrácení jedinečných hodnot. Jinými slovy, pokud existují duplicitní hodnoty, je vrácen pouze jeden výskyt:

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

Výsledek:

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

V tomto případě Fluffy se objeví pouze jednou. Když jej spustíme bez DISTINCT klauzule, Fluffy se objeví dvakrát.

Změna oddělovače

Ve výchozím nastavení seznam používá jako oddělovač čárku. Ale můžeme to změnit, pokud chceme:

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

Výsledek:

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

Můžeme dokonce použít prázdný řetězec k odstranění všech oddělovačů (takže hodnoty jsou zřetězené):

SELECT GROUP_CONCAT(PetName SEPARATOR '')
FROM Pets;

A dostaneme následující výsledek:

FluffyFetchScratchWagTweetFluffyBarkMeow

Výsledky seskupených dotazů

Můžeme zahrnout GROUP_CONCAT() v dotazu s GROUP BY klauzule k dosažení výsledku, jako je tento:

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

Výsledek:

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

V mé databázi jsou skutečná jména typů mazlíčků v jiné tabulce nazvané PetTypes . Mohli bychom tedy spustit INNER JOIN na PetTypes tabulka pro získání skutečných jmen typu domácího mazlíčka:

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;

Výsledek:

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

Omezení délky

Maximální vrácená délka v bajtech je určena group_concat_max_len serverová systémová proměnná, která má výchozí hodnotu 1M (v MariaDB 10.2.4 a vyšší) nebo 1K (v MariaDB 10.2.3 a nižší). Pokud group_concat_max_len je 512 nebo nižší, návratový typ je VARBINARY nebo VARCHAR; jinak je návratový typ BLOB nebo TEXT . Volba mezi binárním nebo nebinárním typem závisí na vstupu.

Aktuální hodnotu můžete zkontrolovat takto:

SHOW VARIABLES LIKE '%group_concat%';

Syntaxe pro změnu této hodnoty je následující:

SET [GLOBAL | SESSION] group_concat_max_len = val;

Kde val je celé číslo bez znaménka.


  1. Export tabulky do souboru se záhlavími sloupců (názvy sloupců) pomocí nástroje bcp a SQL Server 2008

  2. Sloučení datových souborů se Statistica, část 1

  3. Podrobný pohled na indexování databáze

  4. Sestavení problému cx_Oracle - libclntsh.so.11.1 => nenalezeno