MariaDB
 sql >> Baza danych >  >> RDS >> MariaDB

MariaDB GROUP_CONCAT()

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ciągi formatu daty MariaDB

  2. MariaDB SESSION_USER() Objaśnienie

  3. MariaDB JSON_SEARCH() Objaśnienie

  4. Jak NOT REGEXP działa w MariaDB

  5. Migracja sieci bez przestojów za pomocą klastra MySQL Galera przy użyciu węzła przekaźnikowego