MariaDB има GROUP_CONCAT()
функция, която ни позволява да връщаме колони от заявка като разделен списък.
Синтаксис
Синтаксисът е така:
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}])
Пример
Да предположим, че изпълняваме следната заявка:
SELECT PetName
FROM Pets;
И получаваме следния резултат:
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set (0.001 sec)
Можем да използваме GROUP_CONCAT()
за да върнете всички тези редове като разделен списък.
За да постигнем това, всичко, което трябва да направим, е да предадем PetName
колона като аргумент на GROUP_CONCAT()
функция:
SELECT GROUP_CONCAT(PetName)
FROM Pets;
Резултат:
+-------------------------------------------------+ | GROUP_CONCAT(PetName) | +-------------------------------------------------+ | Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow | +-------------------------------------------------+ 1 row in set (0.003 sec)
Поръчка
Можем да използваме ORDER BY
клауза за подреждане на изхода на тази функция:
SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC)
FROM Pets;
Резултат:
Wag,Tweet,Scratch,Meow,Fluffy,Fluffy,Fetch,Bark
Имайте предвид, че това сортира само изхода на GROUP_CONCAT()
функция – тя е напълно независима от всяка подредба, приложена към SELECT
самото изявление.
Ограничаване на изхода
Можем да използваме LIMIT
клауза за ограничаване на броя на елементите, включени в списъка:
SELECT GROUP_CONCAT(PetName LIMIT 3)
FROM Pets;
Резултат:
Fluffy,Fetch,Scratch
Всяка поръчка се прилага преди LIMIT
клауза:
SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC LIMIT 3)
FROM Pets;
Резултат:
Wag,Tweet,Scratch
Имайте предвид, че LIMIT
Клаузата се поддържа само от MariaDB 10.3.3.
DISTINCT
Клауза
Можем да използваме DISTINCT
клауза за връщане на уникални стойности. С други думи, ако има дублиращи се стойности, се връща само едно събитие:
SELECT GROUP_CONCAT(DISTINCT PetName ORDER BY PetName ASC)
FROM Pets;
Резултат:
Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag
В този случай Fluffy
се появява само веднъж. Когато го стартираме без DISTINCT
клауза, Fluffy
се появява два пъти.
Промяна на разделителя
По подразбиране списъкът използва запетаята като разделител. Но можем да променим това, ако желаем:
SELECT GROUP_CONCAT(PetName SEPARATOR '-')
FROM Pets;
Резултат:
Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow
Можем дори да използваме празен низ, за да премахнем всички разделители (така че стойностите да са свързани):
SELECT GROUP_CONCAT(PetName SEPARATOR '')
FROM Pets;
И получаваме следния резултат:
FluffyFetchScratchWagTweetFluffyBarkMeow
Резултати от групирани заявки
Можем да включим GROUP_CONCAT()
в заявка с GROUP BY
клауза за постигане на резултат като този:
SELECT
PetTypeId,
GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets
GROUP BY PetTypeId
ORDER BY PetTypeId;
Резултат:
+-----------+--------------------------------------------+ | PetTypeId | GROUP_CONCAT(PetName ORDER BY PetName ASC) | +-----------+--------------------------------------------+ | 1 | Tweet | | 2 | Fluffy,Meow,Scratch | | 3 | Bark,Fetch,Fluffy,Wag | +-----------+--------------------------------------------+
В моята база данни действителните имена на типове домашни любимци са в друга таблица, наречена PetTypes
. Следователно бихме могли да изпълним INNER JOIN
на PetTypes
таблица, за да получите действителните имена на домашни любимци:
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;
Резултат:
+---------+------------------------------------------------+ | PetType | GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC) | +---------+------------------------------------------------+ | Bird | Tweet | | Cat | Fluffy,Meow,Scratch | | Dog | Bark,Fetch,Fluffy,Wag | +---------+------------------------------------------------+
Ограничения на дължината
Максималната върната дължина в байтове се определя от group_concat_max_len
сървърна системна променлива, която по подразбиране е 1M (в MariaDB 10.2.4 и по-нова версия) или 1K (в MariaDB 10.2.3 и по-ниска). Ако group_concat_max_len
е 512
или по-нисък, типът връщане е VARBINARY
или VARCHAR
; в противен случай, типът връщане е BLOB
или TEXT
. Изборът между двоични или недвоични типове зависи от входа.
Можете да проверите текущата стойност по следния начин:
SHOW VARIABLES LIKE '%group_concat%';
Синтаксисът за промяна на тази стойност е както следва:
SET [GLOBAL | SESSION] group_concat_max_len = val;
Където val
е цяло число без знак.