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

MySQL One-to-Many sang định dạng JSON

Đây là một truy vấn SQL có thể đáp ứng yêu cầu của bạn. Nó sử dụng Hàm tổng hợp MySQL JSON_ARRAYAGG () để tạo một mảng các đối tượng JSON (được tạo bằng cách sử dụng JSON_OBJECT() ).

Cấp độ nhóm trung gian được thực hiện trong tham gia, để tạo ra sales Mảng JSON của mỗi người dùng. Sau đó, kết quả được tổng hợp thành một dòng, với một cột chứa mảng đối tượng JSON.

SELECT
  JSON_ARRAYAGG(JSON_OBJECT('id', u.id, 'name', u.name, 'sales', s.sales))
FROM
    user u
    LEFT JOIN (
        SELECT 
            user, 
            JSON_ARRAYAGG(JSON_OBJECT('id', id, 'item', item)) sales 
        FROM sale 
        GROUP BY user
    ) s ON s.user = u.id

Bản trình diễn trên DB Fiddle

Nếu bạn bọc giá trị trả về bằng JSON_PRETTY , kết quả như sau:

[
  {
    "id": 1,
    "name": "User 1",
    "sales": [
      {
        "id": 1,
        "item": "t-shirt"
      },
      {
        "id": 2,
        "item": "jeans"
      }
    ]
  },
  {
    "id": 2,
    "name": "User 2",
    "sales": [
      {
        "id": 3,
        "item": "sweatpants"
      },
      {
        "id": 4,
        "item": "gloves"
      }
    ]
  }
]

Chỉnh sửa :đây là một giải pháp (xấu) cho MySQL <5,7, không hỗ trợ JSON. Nó chỉ dựa vào các hàm thao tác chuỗi. Xin lưu ý rằng điều này sẽ chỉ hoạt động miễn là các trường varchar không chứa " nhân vật:

SELECT
    CONCAT(
        '[', 
        GROUP_CONCAT( CONCAT( '{ "id":', u.id, ', "name":"', u.name, '", "sales":', s.sales, ' }' )  SEPARATOR ', ' ),
        ']'
    )
FROM 
    user u
    LEFT JOIN (
        SELECT 
            user, 
            CONCAT( 
               '[', 
                GROUP_CONCAT( CONCAT( '{ "id":', id, ', "item":"', item, '" }' ) SEPARATOR ', '),
                ']'
            ) sales 
    FROM sale
    GROUP BY user ) s ON s.user = u.id

Bản trình diễn trên DB Fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chỉ mục duy nhất của MySQL theo nhiều trường

  2. Không thể kết nối với phiên bản RDS từ phiên bản EC2

  3. chỉnh sửa danh sách từ dừng đầy đủ văn bản mysql ở đâu?

  4. Mysql - 30 ngày qua

  5. Lưu trữ mật khẩu cho MYSQL trong ứng dụng PHP một cách an toàn