Условная конкатенация результатов SQL-запроса

#php #sql #prestashop

#php #sql #престашоп

Вопрос:

Я хотел бы показать результаты запроса, объединенные с их собственным именем, на основе значения.

У меня есть этот запрос

         SELECT CONCAT(cl.`name`,',') as name
        FROM `'._DB_PREFIX_.'category_lang` AS cl
        INNER JOIN `'._DB_PREFIX_.'category` AS c ON (cl.`id_category` = c.`id_category`)
        WHERE cl.`name` LIKE '%'.pSQL($searchData).'%'
        AND c.`level_depth` NOT IN (0, 1, 4, 5) and cl.`id_lang`='.(int)$context->language->id.'
 

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

введите описание изображения здесь

Это список результатов:

 Lisbon
Ortisei
Palermo
Polignano a Mare
Portugal
 

Результаты таблицы внутреннего соединения следующие

Результаты приведенного выше запроса

как вы можете видеть, для каждой записи таблицы существует разный level_depth.

Я хотел бы объединить все записи с level_depth=3 с именем их id_parent и показать все записи с level_depth = 2 без какой-либо конкатенации.

Приведенные выше результаты должны стать:

 Lisbon, Portugal
Ortisei, Italy
Palermo, Italy
Polignano a Mare, Italy
Portugal
 

Комментарии:

1. Я предлагаю синтаксис heredoc для больших запросов, подобных этому. Это повысит читабельность и выделит ключевые слова SQL.

Ответ №1:

Для этого требуется левое соединение по id_parent для level_depth 2. У вас должно получиться что-то вроде этого:

 SELECT 
    CONCAT_WS(', ', cl.`name`, cl_parent.`name`) as name
FROM `'._DB_PREFIX_.'category_lang` AS cl
INNER JOIN `'._DB_PREFIX_.'category` AS c 
    ON (cl.`id_category` = c.`id_category`)
LEFT JOIN `'._DB_PREFIX_.'category` AS c_parent 
    ON (c_parent.`id_category` = c.`id_parent`) 
    AND c_parent.`level_depth` = 2
LEFT JOIN `'._DB_PREFIX_.'category_lang` AS cl_parent 
    ON (cl_parent.`id_category` = c_parent.`id_category`) 
    AND cl_parent.id_lang = cl.id_lang
WHERE 
    CONCAT_WS(', ', cl.`name`, cl_parent.`name`) LIKE '%'.pSQL($searchData).'%'
    AND c.`level_depth` IN (2, 3) and cl.`id_lang`='.(int)$context->language->id.'
 

Комментарии:

1. Это именно то, что я искал! Я бы не решил это без вашей помощи! Спасибо!