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

MySQL Един към много към JSON формат

Ето SQL заявка, която може да отговаря на вашите изисквания. Тя използва Агрегирана функция на MySQL JSON_ARRAYAGG() за генериране на масив от JSON обекти (които се създават с помощта на JSON_OBJECT() ).

В рамките на обединението се извършва междинно ниво на групиране, за генериране на sales JSON масив на всеки потребител. След това резултатите се обединяват в един ред с една колона, която съдържа получения 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

Демо на DB Fiddle

Ако обвиете връщаната стойност с JSON_PRETTY , изходът е както следва:

[
  {
    "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"
      }
    ]
  }
]

Редактиране :ето (грозно) решение за MySQL <5.7, където поддръжката на JSON не е налична. Той разчита само на функции за манипулиране на низове. Моля, имайте предвид, че това ще работи само докато полетата на varchar не съдържат " знак :

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

Демо на 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. Как да съхранявам .txt файлове MySQL база данни?

  2. MySQL заявка за изчисляване на предходния месец

  3. Преобразуване на числото на епохата в четлива от човека дата в mysql

  4. mysql_real_escape_string() и mysql_escape_string() достатъчни ли са за сигурността на приложението?

  5. MySQL – MariaDB – Писане на първата съхранена процедура