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.