Функция поиска SQL в массиве json

#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 находится в массиве, а не на «верхнем» уровне, который $.email ищет

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))';