Получение значений из данных Json в массиве в Mysql - PullRequest
0 голосов
/ 10 февраля 2019

Мы сохраняем информацию в столбце json, который содержит данные json в массиве.

Структура данных:

[
    {
        "type":"automated_backfill",
        "title":"Walgreens Sales Ad",
        "keyword":"Walgreens Sales Ad",
        "score":4
    },
    {
        "type":"automated_backfill",
        "title":"Nicoderm Coupons",
        "keyword":"Nicoderm Coupons",
        "score":4
    },
    {
        "type":"automated_backfill",
        "title":"Iphone Sales",
        "keyword":"Iphone Sales",
        "score":3
    },
    {
        "type":"automated_backfill",
        "title":"Best Top Load Washers",
        "keyword":"Best Top Load Washers",
        "score":1
    },
    {
        "type":"automated_backfill",
        "title":"Top 10 Best Cell Phones",
        "keyword":"Top 10 Best Cell Phones",
        "score":1
    },
    {
        "type":"automated_backfill",
        "title":"Tv Deals",
        "keyword":"Tv Deals",
        "score":0
    }
]

Что мы пытаемся:

SELECT id, ad_meta->'$**.type' FROM window_requests

который возвращает:

enter image description here

Мы стремимся получить каждый тип в виде строки, что, я думаю, возможно только с помощью хранимой процедуры, вернуть весь столбец и затем выполнитьЗацикливайтесь на каждой строке и возвращайте данные ...

Или вы можете придумать лучшее решение?

Либо обновить архитектуру:

, либо мы должны изменить нашу базу данных и сохранить информациюв отдельной таблице вместо столбца json?

И тогда мы можем легко объединиться для получения данных с добавлением внешнего ключа.

Спасибо.

1 Ответ

0 голосов
/ 10 февраля 2019

Я понимаю, что вы пытаетесь сгенерировать структуру таблицы из содержимого вашего массива JSON.

Вам потребуется выполнить два шага:

  • сначала, превратить каждый элемент в массиве в запись;для этого вы можете сгенерировать встроенную таблицу чисел и использовать JSON_EXTRACT(), чтобы вызвать соответствующий объект JSON.

  • , затем извлечь значения каждого атрибута из каждого объекта, генерируяновые столбцы;для этого можно использовать оператор ->.

Запрос:

SELECT 
    id,
    rec->'$.type' type,
    rec->'$.score' score,
    rec->'$.title' title,
    rec->'$.keyword' keyword                                   
FROM (
    SELECT t.id, JSON_EXTRACT(t.val, CONCAT('$[', x.idx, ']')) AS rec
    FROM 
        mytable t
        INNER JOIN ( 
            SELECT 0 AS idx    UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
            UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
        ) AS x ON JSON_EXTRACT(t.val, CONCAT('$[', x.idx, ']')) IS NOT NULL
    ) z

Это будет обрабатывать до 10 объектов на массив JSON (если вы ожидаете болеечто, вы можете добавить, разверните UNION ALL часть запроса).

В эту БД Fiddle с вашими тестовыми данными, это дает:

| id  | type                 | score | title                     | keyword                   |
| --- | -------------------- | ----- | ------------------------- | ------------------------- |
| 1   | "automated_backfill" | 4     | "Walgreens Sales Ad"      | "Walgreens Sales Ad"      |
| 1   | "automated_backfill" | 4     | "Nicoderm Coupons"        | "Nicoderm Coupons"        |
| 1   | "automated_backfill" | 3     | "Iphone Sales"            | "Iphone Sales"            |
| 1   | "automated_backfill" | 1     | "Best Top Load Washers"   | "Best Top Load Washers"   |
| 1   | "automated_backfill" | 1     | "Top 10 Best Cell Phones" | "Top 10 Best Cell Phones" |
| 1   | "automated_backfill" | 0     | "Tv Deals"                | "Tv Deals"                |

Примечание: оператор стрелки недоступен в MariaDB.Вместо этого вы можете использовать JSON_EXTRACT(), например:

SELECT 
    id,
    JSON_EXTRACT(rec, '$.type') type,
    JSON_EXTRACT(rec, '$.score') score,
    JSON_EXTRACT(rec, '$.title') title,
    JSON_EXTRACT(rec, '$.keyword') keyword
FROM
    ...
...