MariaDB ma GROUP_CONCAT() funkcja, która umożliwia nam zwracanie kolumn z zapytania w postaci rozdzielanej listy.
Składnia
Składnia wygląda tak:
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}]) Przykład
Załóżmy, że uruchamiamy następujące zapytanie:
SELECT PetName
FROM Pets; I otrzymujemy następujący wynik:
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set (0.001 sec)
Możemy użyć GROUP_CONCAT() aby zwrócić wszystkie te wiersze jako listę rozdzielaną.
Aby to osiągnąć, wystarczy przekazać PetName kolumna jako argument do GROUP_CONCAT() funkcja:
SELECT GROUP_CONCAT(PetName)
FROM Pets; Wynik:
+-------------------------------------------------+ | GROUP_CONCAT(PetName) | +-------------------------------------------------+ | Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow | +-------------------------------------------------+ 1 row in set (0.003 sec)
Zamawianie
Możemy użyć ORDER BY klauzula porządkująca wyjście tej funkcji:
SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC)
FROM Pets; Wynik:
Wag,Tweet,Scratch,Meow,Fluffy,Fluffy,Fetch,Bark
Zauważ, że to sortuje tylko dane wyjściowe GROUP_CONCAT() funkcja – jest całkowicie niezależna od dowolnej kolejności zastosowanej do SELECT samo oświadczenie.
Ograniczanie wydajności
Możemy użyć LIMIT klauzula ograniczająca liczbę pozycji na liście:
SELECT GROUP_CONCAT(PetName LIMIT 3)
FROM Pets; Wynik:
Fluffy,Fetch,Scratch
Każda kolejność jest stosowana przed LIMIT klauzula:
SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC LIMIT 3)
FROM Pets; Wynik:
Wag,Tweet,Scratch
Zwróć uwagę, że LIMIT klauzula jest obsługiwana tylko w MariaDB 10.3.3.
DISTINCT Klauzula
Możemy użyć DISTINCT klauzula zwracająca unikalne wartości. Innymi słowy, jeśli istnieją zduplikowane wartości, zwracane jest tylko jedno wystąpienie:
SELECT GROUP_CONCAT(DISTINCT PetName ORDER BY PetName ASC)
FROM Pets; Wynik:
Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag
W tym przypadku Fluffy pojawia się tylko raz. Kiedy uruchamiamy go bez DISTINCT klauzula, Fluffy pojawia się dwukrotnie.
Zmiana separatora
Domyślnie lista używa przecinka jako ogranicznika. Ale możemy to zmienić, jeśli chcemy:
SELECT GROUP_CONCAT(PetName SEPARATOR '-')
FROM Pets; Wynik:
Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow
Możemy nawet użyć pustego ciągu, aby usunąć wszystkie separatory (aby wartości były połączone):
SELECT GROUP_CONCAT(PetName SEPARATOR '')
FROM Pets; I otrzymujemy następujący wynik:
FluffyFetchScratchWagTweetFluffyBarkMeow
Zgrupowane wyniki zapytań
Możemy dołączyć GROUP_CONCAT() w zapytaniu z GROUP BY klauzula, aby osiągnąć taki wynik:
SELECT
PetTypeId,
GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets
GROUP BY PetTypeId
ORDER BY PetTypeId; Wynik:
+-----------+--------------------------------------------+ | PetTypeId | GROUP_CONCAT(PetName ORDER BY PetName ASC) | +-----------+--------------------------------------------+ | 1 | Tweet | | 2 | Fluffy,Meow,Scratch | | 3 | Bark,Fetch,Fluffy,Wag | +-----------+--------------------------------------------+
W mojej bazie danych rzeczywiste nazwy typów zwierząt znajdują się w innej tabeli o nazwie PetTypes . Mogliśmy zatem uruchomić INNER JOIN w PetTypes tabela, aby uzyskać rzeczywiste nazwy typów zwierząt:
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; Wynik:
+---------+------------------------------------------------+ | PetType | GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC) | +---------+------------------------------------------------+ | Bird | Tweet | | Cat | Fluffy,Meow,Scratch | | Dog | Bark,Fetch,Fluffy,Wag | +---------+------------------------------------------------+
Ograniczenia długości
Maksymalna zwracana długość w bajtach jest określona przez group_concat_max_len zmienna systemowa serwera, która domyślnie wynosi 1 MB (w MariaDB 10.2.4 i nowszych) lub 1 KB (w MariaDB 10.2.3 i nowszych). Jeśli group_concat_max_len to 512 lub niższy, zwracany typ to VARBINARY lub VARCHAR; w przeciwnym razie zwracany typ to BLOB lub TEXT . Wybór między typami binarnymi lub niebinarnymi zależy od danych wejściowych.
Możesz sprawdzić aktualną wartość w ten sposób:
SHOW VARIABLES LIKE '%group_concat%'; Składnia zmiany tej wartości jest następująca:
SET [GLOBAL | SESSION] group_concat_max_len = val;
Gdzie val jest liczbą całkowitą bez znaku.