Как осуществить поиск (like) по полю в массиве в json колонке?
Есть поле 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 в каждом массиве?
Дополнительно:
окей гугл
Ответы:
Сделать нормализацию структуры базы.
Перенести 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 - технический долг будет только нарастать. Лучше переделать по уму, технический долг исчезнет.
- Добавил пример, как делать не надо.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для осуществления поиска (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 колонке. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.