MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

MariaDB GROUP_CONCAT ()

MariaDB có GROUP_CONCAT() chức năng cho phép chúng tôi trả về các cột từ truy vấn dưới dạng danh sách được phân tách.

Cú pháp

Cú pháp như sau:

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}])

Ví dụ

Giả sử chúng ta chạy truy vấn sau:

SELECT PetName 
FROM Pets;

Và chúng tôi nhận được kết quả sau:

+---------+
| PetName |
+---------+
| Fluffy  |
| Fetch   |
| Scratch |
| Wag     |
| Tweet   |
| Fluffy  |
| Bark    |
| Meow    |
+---------+
8 rows in set (0.001 sec)

Chúng ta có thể sử dụng GROUP_CONCAT() để trả về tất cả các hàng đó dưới dạng danh sách được phân tách.

Để đạt được điều này, tất cả những gì chúng ta cần làm là vượt qua PetName làm đối số cho GROUP_CONCAT() chức năng:

SELECT GROUP_CONCAT(PetName) 
FROM Pets;

Kết quả:

+-------------------------------------------------+
| GROUP_CONCAT(PetName)                           |
+-------------------------------------------------+
| Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow |
+-------------------------------------------------+
1 row in set (0.003 sec)

Đặt hàng

Chúng ta có thể sử dụng ORDER BY mệnh đề đặt hàng đầu ra của hàm này:

SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC)
FROM Pets;

Kết quả:

Wag,Tweet,Scratch,Meow,Fluffy,Fluffy,Fetch,Bark

Lưu ý rằng điều này chỉ sắp xếp đầu ra của GROUP_CONCAT() chức năng - nó hoàn toàn độc lập với bất kỳ thứ tự nào được áp dụng cho SELECT tuyên bố chính nó.

Giới hạn đầu ra

Chúng tôi có thể sử dụng LIMIT điều khoản giới hạn số lượng mục được đưa vào danh sách:

SELECT GROUP_CONCAT(PetName LIMIT 3)
FROM Pets;

Kết quả:

Fluffy,Fetch,Scratch

Mọi đơn đặt hàng đều được áp dụng trước LIMIT mệnh đề:

SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC LIMIT 3)
FROM Pets;

Kết quả:

Wag,Tweet,Scratch

Lưu ý rằng LIMIT mệnh đề chỉ được hỗ trợ từ MariaDB 10.3.3.

DISTINCT Mệnh đề

Chúng tôi có thể sử dụng DISTINCT mệnh đề để trả về các giá trị duy nhất. Nói cách khác, nếu có các giá trị trùng lặp, chỉ một lần xuất hiện được trả về:

SELECT GROUP_CONCAT(DISTINCT PetName ORDER BY PetName ASC)
FROM Pets;

Kết quả:

Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag

Trong trường hợp này, Fluffy chỉ xuất hiện một lần. Khi chúng tôi chạy nó mà không có DISTINCT mệnh đề, Fluffy xuất hiện hai lần.

Thay đổi Dấu phân tách

Theo mặc định, danh sách sử dụng dấu phẩy làm dấu phân cách. Nhưng chúng tôi có thể thay đổi điều này nếu chúng tôi muốn:

SELECT GROUP_CONCAT(PetName SEPARATOR '-')
FROM Pets;

Kết quả:

Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow

Chúng tôi thậm chí có thể sử dụng một chuỗi trống để loại bỏ tất cả các dấu phân cách (để các giá trị được nối với nhau):

SELECT GROUP_CONCAT(PetName SEPARATOR '')
FROM Pets;

Và chúng tôi nhận được kết quả sau:

FluffyFetchScratchWagTweetFluffyBarkMeow

Kết quả truy vấn được nhóm

Chúng tôi có thể bao gồm GROUP_CONCAT() trong một truy vấn với GROUP BY mệnh đề để đạt được kết quả như sau:

SELECT 
    PetTypeId,
    GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets
GROUP BY PetTypeId
ORDER BY PetTypeId;

Kết quả:

+-----------+--------------------------------------------+
| PetTypeId | GROUP_CONCAT(PetName ORDER BY PetName ASC) |
+-----------+--------------------------------------------+
|         1 | Tweet                                      |
|         2 | Fluffy,Meow,Scratch                        |
|         3 | Bark,Fetch,Fluffy,Wag                      |
+-----------+--------------------------------------------+

Trong cơ sở dữ liệu của tôi, tên loại vật nuôi thực tế nằm trong một bảng khác được gọi là PetTypes . Do đó, chúng tôi có thể chạy INNER JOIN trên PetTypes bảng để lấy tên loại vật nuôi thực 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;

Kết quả:

+---------+------------------------------------------------+
| PetType | GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC) |
+---------+------------------------------------------------+
| Bird    | Tweet                                          |
| Cat     | Fluffy,Meow,Scratch                            |
| Dog     | Bark,Fetch,Fluffy,Wag                          |
+---------+------------------------------------------------+

Giới hạn về độ dài

Độ dài trả về tối đa tính bằng byte được xác định bởi group_concat_max_len biến hệ thống máy chủ, mặc định là 1M (trong MariaDB 10.2.4 trở lên) hoặc 1K (trong MariaDB 10.2.3 trở xuống). Nếu group_concat_max_len512 hoặc thấp hơn, loại trả về là VARBINARY hoặc VARCHAR; nếu không, kiểu trả về là BLOB hoặc TEXT . Sự lựa chọn giữa các loại nhị phân hoặc không nhị phân phụ thuộc vào đầu vào.

Bạn có thể kiểm tra giá trị hiện tại như sau:

SHOW VARIABLES LIKE '%group_concat%';

Cú pháp để thay đổi giá trị này như sau:

SET [GLOBAL | SESSION] group_concat_max_len = val;

Ở đâu val là một số nguyên không dấu.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. So sánh tính khả dụng cao của cơ sở dữ liệu - MySQL / MariaDB Replication so với Oracle Data Guard

  2. Các bài đăng trên blog về cơ sở dữ liệu phổ biến nhất của chúng tôi trong năm 2017

  3. Cách cài đặt và bảo mật MariaDB trên Debian 9

  4. Cách ADD_MONTHS () hoạt động trong MariaDB

  5. Tường lửa SQL trở nên dễ dàng với ClusterControl &ProxySQL