Trong MariaDB, JSON_ARRAYAGG()
là một hàm tích hợp trả về một mảng JSON chứa một phần tử cho mỗi giá trị trong một tập hợp các giá trị JSON hoặc SQL nhất định.
Hàm hoạt động trên một cột hoặc một biểu thức đánh giá một giá trị duy nhất. Nó cho phép bạn tổng hợp tập hợp kết quả thành một mảng JSON duy nhất. Mỗi hàng của tập hợp kết quả kết thúc như một phần tử duy nhất trong mảng.
Cú pháp
Cú pháp như sau:
JSON_ARRAYAGG([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}])
Ví dụ
Giả sử chúng ta truy vấn một bảng:
SELECT PetName
FROM Pets;
Và nhận được tập hợp kết quả sau:
+ --------- + | PetName | + --------- + | Lông tơ || Tìm nạp || Cào cào || Wag || Tweet || Lông tơ || Vỏ cây || Meo meo | + --------- +
Kết quả là một cột và mỗi hàng chứa một tên vật nuôi khác nhau.
Giả sử chúng tôi muốn tất cả vật nuôi được liệt kê trong một mảng JSON (để mỗi tên vật nuôi là phần tử mảng của riêng nó).
Chúng tôi có thể sử dụng JSON_ARRAYAGG()
chức năng để làm điều đó:
SELECT JSON_ARRAYAGG(PetName)
FROM Pets;
Kết quả:
+ ---------------------------------------------- --------------------- + | JSON_ARRAYAGG (PetName) | + -------------------------------------------- ----------------------- + | ["Fluffy", "Fetch", "Scratch", "Wag", "Tweet", "Fluffy", "Bark", "Meow"] | + --------------- -------------------------------------------------- - +
Tất cả những gì chúng tôi đã làm là chuyển tên cột vào JSON_ARRAYAGG()
hàm số.
Kết quả khác biệt
Chúng tôi có thể thêm DISTINCT
mệnh đề xóa các giá trị trùng lặp khỏi mảng:
SELECT JSON_ARRAYAGG(DISTINCT PetName)
FROM Pets;
Kết quả:
+ ---------------------------------------------- ------------ + | JSON_ARRAYAGG (DISTINCT PetName) | + ------------------------------------------- --------------- + | ["Bark", "Fetch", "Fluffy", "Meow", "Scratch", "Tweet", "Wag"] | + ------------------- --------------------------------------- +
Lưu ý rằng Fluffy
chỉ được đưa vào một lần ở đây, trong khi Fluffy
đã được đưa vào hai lần trong ví dụ trước (vì có hai vật nuôi được gọi là Fluffy
).
Sắp xếp kết quả
Chúng ta có thể sử dụng ORDER BY
mệnh đề để chỉ định thứ tự cho các phần tử mảng:
SELECT JSON_ARRAYAGG(PetName ORDER BY PetName DESC)
FROM Pets;
Kết quả:
+ ---------------------------------------------- --------------------- + | JSON_ARRAYAGG (PetName ORDER BY PetName DESC) | + ---------------------------------------- --------------------------- + | ["Wag", "Tweet", "Scratch", "Meow", "Fluffy", "Fluffy", "Fetch", "Bark"] | + --------------- -------------------------------------------------- - +
Giới hạn kết quả
Chúng tôi có thể sử dụng LIMIT
mệnh đề để chỉ định thứ tự cho các phần tử mảng:
SELECT JSON_ARRAYAGG(PetName LIMIT 3)
FROM Pets;
Kết quả:
+ -------------------------------- + | JSON_ARRAYAGG (PetName LIMIT 3) | + -------------------------------- + | ["Fluffy", "Fetch", "Scratch"] | + -------------------------------- +Chúng tôi cũng có thể sử dụng phần bù cho
LIMIT
mệnh đề:SELECT JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2) FROM Pets;
Kết quả:
+ ----------------------------------------- + | JSON_ARRAYAGG (PetName LIMIT 3 OFFSET 2) | + ---------------------------------------- - + | ["Scratch", "Wag", "Tweet"] | + ----------------------------------- ------ +Ngoài ra, chúng tôi có thể bỏ qua
LIMIT
vàOFFSET
từ khóa và chuyển đổi các số xung quanh (và phân tách chúng bằng dấu phẩy) để đạt được cùng một kết quả:SELECT JSON_ARRAYAGG(PetName LIMIT 2, 3) FROM Pets;
Kết quả:
+ ----------------------------------- + | JSON_ARRAYAGG (PetName LIMIT 2, 3) | + ----------------------------------- + | ["Scratch", "Wag", "Tweet"] | + ----------------------------------- +Kết quả được nhóm
Chúng ta có thể sử dụng SQL
GROUP BY
mệnh đề tạo mảng dựa trên nhóm của một cột khác.Giả sử chúng ta thêm một cột vào truy vấn ban đầu của mình:
SELECT PetTypeId, PetName FROM Pets;
Kết quả:
+ ----------- + --------- + | PetTypeId | PetName | + ----------- + --------- + | 2 | Lông tơ || 3 | Tìm nạp || 2 | Cào cào || 3 | Wag || 1 | Tweet || 3 | Lông tơ || 3 | Vỏ cây || 2 | Meo meo | + ----------- + --------- +Bây giờ chúng ta có một
PetTypeId
cũng nhưPetName
cột. Điều này phù hợp với loại vật nuôi với mỗi tên.Đây là ví dụ về việc sử dụng
GROUP BY
mệnh đề nhóm các kết quả của chúng tôi theoPetTypeId
trong khi sử dụngJSON_ARRAYAGG()
chức năng:SELECT PetTypeId, JSON_ARRAYAGG(PetName) FROM Pets GROUP BY PetTypeId;
Kết quả:
+ ----------- + --------------------------------- + | PetTypeId | JSON_ARRAYAGG (PetName) | + ----------- + -------------------------------- - + | 1 | ["Tweet"] || 2 | ["Fluffy", "Scratch", "Meo meo"] || 3 | ["Fetch", "Wag", "Fluffy", "Bark"] | + ----------- + ------------------- -------------- +Điều này cho phép chúng tôi tạo một mảng riêng biệt cho từng loại vật nuôi.
Truy vấn sau sử dụng
INNER JOIN
trên một bảng khác để trả về loại vật nuôi thực tế, không chỉ ID.SELECT pt.PetType, p.PetName FROM Pets p INNER JOIN PetTypes pt ON pt.PetTypeId = p.PetTypeId ORDER BY PetType;
Kết quả:
+ --------- + --------- + | PetType | PetName | + --------- + --------- + | Chim | Tweet || Con mèo | Cào cào || Con mèo | Lông tơ || Con mèo | Meo meo || Con chó | Wag || Con chó | Tìm nạp || Con chó | Vỏ cây || Con chó | Fluffy | + --------- + --------- +Chúng ta có thể thấy rằng mỗi loại vật nuôi được liệt kê trong cột đầu tiên và tên vật nuôi được liệt kê trong cột thứ hai.
Bây giờ, hãy sử dụng
JSON_ARRAYAGG()
chức năng:SELECT pt.PetType, JSON_ARRAYAGG(p.PetName) FROM Pets p INNER JOIN PetTypes pt ON pt.PetTypeId = p.PetTypeId GROUP BY pt.PetType;
Kết quả:
+ --------- + -------------------------- + | PetType | JSON_ARRAYAGG (p.PetName) | + --------- + -------------------------- + | Chim | Tweet || Con mèo | Cào, Xạo, Meo meo || Con chó | Wag, Fetch, Bark, Fluffy | + --------- + -------------------------- +