#php #sql #json
#php #sql #json
Вопрос:
Всем привет (надеюсь, название правильное, мой английский иногда ржавый)
Я выполнил функцию поиска, она работает для моей «кодовой» информации, названий моих компаний, но мне нужно искать электронную почту, которая находится в записи json, я сделал это так :
$sql = 'SELECT SQL_CALC_FOUND_ROWS * FROM ' . $this->table . ' AS s
WHERE ((s.code LIKE :q)
OR (s.company_name LIKE :q)
OR (JSON_EXTRACT(s.contacts, "$.email") LIKE :q))';
В чем моя ошибка?
Комментарии:
1. Хорошо, можете ли вы поделиться примерами данных JSON? Одной строки должно быть достаточно, вы можете замаскировать реальные значения, важна структура.
2. конечно, [{«фамилия»: «Бонно»,»имя»: «Жан», «электронная почта»:»justinbridou@live.fr «,»телефон1»: «0675421357»}]
3. Я думаю, что это сбой, потому что ваш JSON находится в массиве, а не на «верхнем» уровне, который
4. итак, моя электронная почта находится на 2-м уровне, что мне делать? может быть, мне следует сделать foreach из моих «s.contacts»?
5. Похоже
contacts
, действительно должна быть другая таблица. Избавит вас от множества головных болей, подобных этой.
Ответ №1:
Хорошо, поэтому я использовал этот ответ :
OR (JSON_EXTRACT(s.contacts, "$**.email") LIKE :q))';
Как @dazed-and-confused указал, что мое электронное письмо не было на верхнем уровне, поэтому я использовал ** для перехода на 2-й уровень, и это сработало.
Комментарии:
1. Единственное, что связано с этим решением, это то, что если строка JSON содержит несколько массивов, этот метод получит все из них, которые совпадают, а не только один.
2. не могу придумать другого способа сделать это, какие-либо предложения?
3.
OR (JSON_EXTRACT(s.contacts, "$[0].email") LIKE :q))';