sql >> Database teknologi >  >> RDS >> Mysql

Sådan indsætter du JSON i en kolonnedata, hvis underforespørgsel returnerer mere end 1 række i MySQL

Lidt indviklet, men du kan oprette JSON-objekter for hver række, sammenkæde dem ved hjælp af GROUP_CONCAT og cast resultatet (indpakket i [] for at gøre det til et array) til 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 portfoliosFROM user uLEFT JOIN portfolio p ON u.uid=p.uidWHERE p.status =1GROUP BY u.uid, u.username;

...hvilket giver...

+------+----------+------------------------ -------------------------------------------------- -------------------------------------------------- ------------+| 1 | manoj | [{"pid":1, "title":"title 1", "status":1}, {"pid":2, "title":"title 2", "status":1}, {"pid ":3, "title":"titel 3", "status":1}] || 2 | test | [{"pid":4, "title":"titel 1", "status":1}] || 3 | bruger | NULL || 4 | virksomhed | NULL |+------+------------------ -------------------------------------------------- -------------------------------------------------- --------+

Hvis du bruger en ældre MySQL uden JSON-understøttelse, kan du bygge den som en streng;

SELECT u.uid, u.username, CASE WHEN p.uid IS NULL THEN NULL ELSE CONCAT('[', GROUP_CONCAT(CONCAT('{ "pid":',p.pid,'," title":"', REPLACE(s.title, '"', '\\"'), '","status":',p.status, ' }')), ']') END portfoliosFROM user u VENSTRE JOIN portefølje p PÅ u.uid=p.uid OG p.status=1GRUPPER EFTER u.uid, u.username; 

...som vil give dig...

+------+----------+------------------------ -------------------------------------------------- -------------------------------------------------- -+| uid | brugernavn | porteføljer |+------+-----------+------------------------------------- -------------------------------------------------- -------------------------------------------------------+| 1 | manoj | [{ "pid":2,"title":"titel 2","status":1 },{ "pid":3,"title":"titel 3","status":1 },{ "pid" ":1,"title":"titel 1","status":1 }] || 2 | test | [{ "pid":4,"title":"titel 1","status":1 }] || 3 | bruger | NULL || 4 | virksomhed | NULL |+------+------------------ -------------------------------------------------- -------------------------------------------------------+

  1. ORA-00907, når du forsøger at oprette en CHECK-begrænsning

  2. Hvordan tilføjer man 2 punkter med afstand mellem dem (SRID =32636)?

  3. MySQL autoincrement-kolonnen hopper med 10 - hvorfor?

  4. MySQL VS Postgres/POSTGIS rumlige databaseunderstøttelse