@Galdar
Web, JS, PHP, NGINX, Linux

Как построить SQL запрос по поиску совпадений в JSON строке?

Добрый день, появилась такая очень интересная задача, надо найти записи по совпадению, но строка в формате JSON.
При поиски по идентификатору, находит несколько записей:
Вывод результата в столбце
{"id":"1000004688","ap_name":"Яблоко","ap_city_id":"","itn":"","kpp":"","okpo":""}
{"id":"1000004688","ap_name":"Апельсин","ap_city_id":"","itn":"","kpp":"","okpo":""}
{"id":"1000004688","ap_name":"Арбуз","ap_city_id":"","itn":"","kpp":"","okpo":""}

После чего по этим записям идет сортировка по %Aп%. В результате будет получена только одна запись:
Полученные данные после сортировки

{"id":"1000004688","ap_name":"Апельсин","ap_city_id":"","itn":"","kpp":"","okpo":""}



Реализация такого способа была такая:
sql запрос с фильтром

SELECT contragent , 
COUNT(*) OVER() as `total_count` FROM ( 
	SELECT  `contragents`.`id`, 
	CONCAT_WS('', '{\"id\":\"', A.`id`,'\"', ',\"ap_name\":\"', A.`ap_name`,'\"', ',\"ap_city_id\":\"', AA.`name_ru`,'\"', ',\"itn\":\"', A.`itn`,'\"', ',\"kpp\":\"', A.`kpp`,'\"', ',\"okpo\":\"', A.`okpo`,'\"','}') AS `entpr_id`, 
	CONCAT_WS('', '{\"id\":\"', B.`id`,'\"', ',\"ap_name\":\"', B.`ap_name`,'\"', ',\"ap_city_id\":\"', AB.`name_ru`,'\"', ',\"itn\":\"', B.`itn`,'\"', ',\"kpp\":\"', B.`kpp`,'\"', ',\"okpo\":\"', B.`okpo`,'\"','}') AS `contragent`, 
	`contragents`.`type`, `contragents`.`ctype`, `contragents`.`resp`, `contragents`.`author`, 
	`contragents`.`code`, `contragents`.`contract`, `contragents`.`owner`, 
	COUNT(*) OVER() as `total_count`  
	FROM `contragents`  
	LEFT JOIN `companies` A on A.`id` = `contragents`.`entpr_id` 
	LEFT JOIN `companies` B on B.`id` = `contragents`.`contragent` 
	LEFT JOIN `cities` AA on AA.`id` = `A`.`ap_city_id` 
	LEFT JOIN `cities` AB on AB.`id` = `B`.`ap_city_id` 
	WHERE      
	`contragents`.`id` IS NOT NULL  AND  ( `contragents`.`entpr_id` IN (1000004688) ) 
) AS res 
WHERE contragent 
LIKE '%Ап%' ORDER BY substring_index(contragent,'\"ap_name\":',-1) LIMIT 50 OFFSET 0;



Как видно из запроса, сначала JSON строка была сформирована, после чего с использованием substring_index была найдена нужная.

Хотелось бы избавится от двух селектов в одном запросе и каким то образом искать по JSON путем перебора. Да можно было бы получить данные отсортировать и выдать результат, но тут такая проблема что есть LIMIT 50 OFFSET 0, который в результате поиска выведет ограниченное число записей, а искать будет по 1мл. записей. Таким образом получать результат в 1мл. записей и сортировать его не вариант. Какие есть варианта дорогие знатоки?
  • Вопрос задан
  • 818 просмотров
Решения вопроса 1
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы