Как осуществить поиск (like) по полю в массиве в json колонке?

Ссылка скопирована
1 ответ

Есть поле phones которое содержит похожие данные:

[ {"field": "Дополнительное поле", "phone": "70000000001"},  {"field": "Внутренний 999", "phone": "70000000002"},  {"field": null, "phone": "70000000003"} ]

[ {"field": "Дополнительное поле", "phone": "70000000001"}, {"field": "Внутренний 999", "phone": "70000000002"}, {"field": null, "phone": "70000000003"} ]

Как можно выполнить like запрос по полю phone в каждом массиве?

Дополнительно:

окей гугл

  • vhood, нет это не подходит т.к. в колонке хранится объект и поиск идет по конкретному полю данного объекта, а у меня в колонке массив и нужно искать по всем элементам данного массива, по конкретному полю т.е. phones->N->phone like '%001%'.
  • Вячеслав Шевченко, не проблема, можно погуглить еще
  • Вячеслав Шевченко, как только возникает поиск, индекс и подобное по json, лучше сразу нормализовать данные, с "простым" json еще можно поизвращаться, но дальше это только лишние проблемы. Либо использовать внешние сервисы поиска, типа elasticsearch
  • Ответы:

    Сделать нормализацию структуры базы.
    Перенести JSON в таблицу user_phone.
    Поля:
    phone_id, -- первичный ключ телефона
    user_id, -- внешний ключ, кому относится телефон
    phone, -- телефон
    phone_comment, -- комментарий к телефону
    -- еще поля по вкусу, но иногда выручающие
    is_main, -- основной не основной/порядок приоритета
    add_date -- дата внесения телефона
    И в запросах уже нормально джойнить и лайкать эту таблицу.
    PS:
    В качестве временного костыля (ни в коем случае не оставлять на постоянной основе!):

    SELECT Users.*,        ph.value->>'phone' as phone FROM Users, json_array_elements(Users.phones) as ph where ph.value->>'phone'   like '7%3';

    SELECT Users.*, ph.value->>'phone' as phone FROM Users, json_array_elements(Users.phones) as ph where ph.value->>'phone' like '7%3';

    • Мне самому такой подход сильно ближе, но я на проект только заступил и так было сделано и человеку, кторый это сделал нравится то, что с минимальным кол-вом движений можно добавить поле. Но как по мне с выборкой прям много сложностей. Хотя возможно надо прям погрузится, изучить работу с json.
    • Будет еще больше сложностей, когда внедрите extract-json - технический долг будет только нарастать. Лучше переделать по уму, технический долг исчезнет.
    • Добавил пример, как делать не надо.
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Павел Админов Ответ

    Для осуществления поиска (like) по полю в массиве в json колонке, вам потребуется использовать функцию JSON_CONTAINS, которая предоставляется в MySQL версии 5.7 и выше.

    Прежде всего, убедитесь, что ваш столбец с json данными имеет правильный формат. Допустим, у вас есть таблица с названием 'users', в которой есть столбец 'data' с json данными.

    Пример структуры таблицы:
    ```
    CREATE TABLE users (
    id INT PRIMARY KEY,
    data JSON
    );
    ```

    Теперь предположим, что у вас есть записи в таблице 'users' и вы хотите найти все записи, у которых поле 'name' содержит подстроку 'John'. Для этого используйте следующий запрос:

    ```php
    SELECT * FROM users WHERE JSON_CONTAINS(data->'$.name', '"%John%"', '$');
    ```

    В данном запросе мы используем функцию JSON_CONTAINS, чтобы проверить, содержит ли поле 'name' подстроку 'John'. Обратите внимание, что мы оборачиваем подстроку в двойные кавычки и добавляем знак процента (%) для выполнения операции подобия (like).

    Если вам нужно выполнить поиск по другому полю или использовать другие фильтры, просто измените путь к полю в выражении data->'$.field'.

    Надеюсь, это поможет вам осуществить поиск (like) по полю в массиве в json колонке. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно