MariaDB
 sql >> база данни >  >> RDS >> MariaDB

MariaDB GROUP_CONCAT()

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 е цяло число без знак.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Главният мениджър за висока достъпност (MHA) се сри! Какво да правя сега?

  2. Как LPAD() работи в MariaDB

  3. Задайте набора от символи и съпоставяне на база данни в MariaDB

  4. Обяснено за оператора на MariaDB INTERSECT

  5. Как работи SQRT() в MariaDB