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

Cách đặt JSON vào dữ liệu cột nếu truy vấn con trả về nhiều hơn 1 hàng trong MySQL

Hơi phức tạp nhưng bạn có thể tạo các đối tượng JSON cho mỗi hàng, nối chúng bằng cách sử dụng GROUP_CONCAT và truyền kết quả (được bọc trong [] để biến nó thành một mảng) thành JSON;

SELECT u.uid, u.username, 
  CASE WHEN p.uid IS NULL 
       THEN NULL 
       ELSE CAST(CONCAT('[',
                   GROUP_CONCAT(JSON_OBJECT('pid', p.pid,
                                            'title', p.title, 
                                            'status', p.status)),     
                 ']') AS JSON) END portfolios
FROM user u
LEFT JOIN portfolio p
  ON u.uid=p.uid
WHERE p.status = 1
GROUP BY u.uid, u.username;

... mang lại ...

+------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
|    1 | manoj    | [{"pid": 1, "title": "title 1", "status": 1}, {"pid": 2, "title": "title 2", "status": 1}, {"pid": 3, "title": "title 3", "status": 1}] |
|    2 | testing  | [{"pid": 4, "title": "title 1", "status": 1}]                                                                                           |
|    3 | user     | NULL                                                                                                                                    |
|    4 | company  | NULL                                                                                                                                    |
+------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+

Nếu bạn đang sử dụng MySQL cũ hơn mà không hỗ trợ JSON, bạn có thể xây dựng nó dưới dạng chuỗi;

SELECT u.uid, u.username, 
  CASE WHEN p.uid IS NULL
  THEN NULL 
  ELSE CONCAT('[', 
    GROUP_CONCAT(CONCAT('{ "pid":',p.pid,',"title":"', REPLACE(p.title, '"', '\\"'),
           '","status":',p.status, ' }')), ']') END portfolios
FROM user u 
LEFT JOIN portfolio p 
  ON u.uid=p.uid AND p.status=1
GROUP BY u.uid, u.username;

... sẽ mang lại cho bạn ...

+------+----------+------------------------------------------------------------------------------------------------------------------------------+
| uid  | username | portfolios                                                                                                                   |
+------+----------+------------------------------------------------------------------------------------------------------------------------------+
|    1 | manoj    | [{ "pid":2,"title":"title 2","status":1 },{ "pid":3,"title":"title 3","status":1 },{ "pid":1,"title":"title 1","status":1 }] |
|    2 | testing  | [{ "pid":4,"title":"title 1","status":1 }]                                                                                   |
|    3 | user     | NULL                                                                                                                         |
|    4 | company  | NULL                                                                                                                         |
+------+----------+------------------------------------------------------------------------------------------------------------------------------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. gán tất cả các kết quả while cho một biến

  2. Truy vấn tổng MYSQL với điều kiện IF

  3. Tạo các trường ngày, tháng, năm trong MySQL

  4. MySQL:Cột chứa từ từ danh sách từ

  5. mysqldump với utf8 không thể xuất chuỗi biểu tượng cảm xúc phù hợp