mysql JSON найти по элементу в массиве
разбираюсь сейчас с одной задачей, нужно найти GUID по номеру телефона, который в массиве в объекте JSON, и впринципе как-бы он находит... но мне не очень то и нравится.
Есть JSON массив phones в таблице phonebook
[{"phone": "8800***3535", "comment": "Какой-то комментарий"}, {"phone": "895***59900", "comment": "Какой-то комментарий"}]
и в этой же строке есть поле guid
Нужно вывести GUID который принадлежит. Но нужно по любому из элементов массива, грубо говоря найти "чёрт побери" кому номер относится
Вот такой код у меня работает, но я понимаю что он не правильный,
SELECT guid FROM phonebook WHERE JSON_CONTAINS(phonebook.phones, '{"phone":"8800***3535"}')
кто мастера JSON подскажите!)
Первый пост... вроде как опыт есть, но видимо его нет
Ответы (2 шт):
Костыль, конечно, но всё же.
SELECT `guid` FROM `phonebook` WHERE `phones` LIKE '%"8800***3535"%'
В выражении %"8800***3535"% процент будет означать любое количество (включая 0) любых символов. В представленном конкретном случае поиск строки будет происходить по правилам:
- Любые символы до необходимого выражения
- Необходимое выражение –
"8800***3535" - Любые символы после необходимого выражения
Если проще говоря, данный способ не будет декодировать JSON и выбирать конкретный параметр, а просто будет сравнивать строку с шаблоном: любые символы + кавычка + необходимый номер + кавычка + любые символы.
Можно немного отредактировать, чтоб искался шаблон "phone": "8800***3535".
SELECT `guid` FROM `phonebook` WHERE `phones` LIKE '%"phone": "8800***3535"%'
Вы можете использовать функцию JSON_SEARCH (wiki). Эта функция доступна с MySQL 5.7
Вот решение:
SELECT `guid` FROM `phonebook` WHERE JSON_SEARCH(`phones`, 'one', '8800***3535', NULL, '$[*].phone') IS NOT NULL