Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да поставите JSON в данни в колона, ако подзаявката върне повече от 1 ред в MySQL

Малко объркано, но можете да създадете JSON обекти за всеки ред, да ги свържете с помощта на GROUP_CONCAT и преместете резултата (обвит в [] за да го превърнете в масив) в 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;

...което дава...

+------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
|    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                                                                                                                                    |
+------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+

Ако използвате по-стар MySQL без поддръжка на JSON, можете да го създадете като низ;

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;

...което ще ви даде...

+------+----------+------------------------------------------------------------------------------------------------------------------------------+
| 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. PHP календар с повтарящи се събития от MySQL база данни

  2. Искам да направя INSERT без запис в DB

  3. Обектите на Django queryset връщат None вместо 0, въпреки че базата данни има 0, съхранена като стойност на полето

  4. Не намирам грешка. Този код се справя добре. Актуализирайте данните ми перфектно. Но се показва 1 грешка

  5. Система за съобщения с PHP/MySQL