Как использовать псевдоним (алиас) в шаблоне LIKE MySQL

Рейтинг: 0Ответов: 2Опубликовано: 14.03.2023

коллеги!

Вопрос про вот такой SQL-запрос:

    $tmpSQL = 'SELECT `pcab_business`.`ID` as "anonym_id", `pcab_business`.`business_name` as "anonym_name", `pcab_categories4businesses`.`category_id` as "category_id", ';
    $tmpSQL .= ' (SELECT `pcab_categories`.`category_name` FROM `pcab_categories` WHERE `pcab_categories`.`ID`=`pcab_categories4businesses`.`category_id`) as "category_name", ';
    $tmpSQL .= ' (SELECT `pcab_projectmeta`.`project_id` FROM `pcab_projectmeta` WHERE `meta_key` LIKE "anonim_professional_project" AND `meta_value` LIKE "%anonym_id%") as "project_id" ';
    $tmpSQL .= ' FROM `pcab_business` LEFT JOIN `pcab_categories4businesses` ON `pcab_business`.`ID`= `pcab_categories4businesses`.`business_id` WHERE `user_id` = 0 ';

На выходе (то, что передается БД) получается:

SELECT `pcab_business`.`ID` as "anonym_id", `pcab_business`.`business_name` as "anonym_name", `pcab_categories4businesses`.`category_id` as "category_id",  (SELECT `pcab_categories`.`category_name` FROM `pcab_categories` WHERE `pcab_categories`.`ID`=`pcab_categories4businesses`.`category_id`) as "category_name",  (SELECT `pcab_projectmeta.`project_id` FROM `pcab_projectmeta` WHERE `meta_key` LIKE "anonim_professional_project" AND `meta_value` LIKE "%anonym_id%")  FROM `pcab_business` LEFT JOIN `pcab_categories4businesses` ON `pcab_business`.`ID`= `pcab_categories4businesses`.`business_id` WHERE `user_id` = 0

А мне надо, чтобы в LIKE "%anonim_id%" подставлялось значение из SELECT pcab_business.ID as "anonym_id" - то есть id из текущей строки.

Буду признателен за совет, куда копать. Гугл, к сожалению, рассказывает про алиасы, но без применения их в шаблоне LIKE.

Ответы

▲ 3

Если почистить запрос от PHP-кода и отформатировать его, получится

SELECT `pcab_business`.`ID` as "anonym_id", 
       `pcab_business`.`business_name` as "anonym_name", 
       `pcab_categories4businesses`.`category_id` as "category_id",
       ( SELECT `pcab_categories`.`category_name` 
         FROM `pcab_categories` 
         WHERE `pcab_categories`.`ID`=`pcab_categories4businesses`.`category_id`
         ) as "category_name", 
       ( SELECT `pcab_projectmeta`.`project_id` 
         FROM `pcab_projectmeta` 
         WHERE `meta_key` LIKE "anonim_professional_project" 
           AND `meta_value` LIKE "%anonym_id%"
         ) as "project_id" 
FROM `pcab_business` 
LEFT JOIN `pcab_categories4businesses` 
    ON `pcab_business`.`ID`= `pcab_categories4businesses`.`business_id` 
WHERE `user_id` = 0;

Так сразу видны ошибки.

Первая - идеологическая. Сравнение двух строковых значений выполняется оператором сравнения =, а не оператором проверки на соответствие шаблону LIKE.

Вторая - использование двойных кавычек для квотирования имён объектов. Кстати, в запросе вообще нет имён, требующих квотирования.

Третья - использование алиаса выходного поля в подзапросе.

Если исправить, получится

SELECT pcab_business.ID as anonym_id, 
       pcab_business.business_name as anonym_name, 
       pcab_categories4businesses.category_id as category_id,
       ( SELECT pcab_categories.category_name 
         FROM pcab_categories 
         WHERE pcab_categories.ID = pcab_categories4businesses.category_id
         ) as category_name, 
       ( SELECT pcab_projectmeta.project_id 
         FROM pcab_projectmeta 
         WHERE meta_key = 'anonim_professional_project'
           AND meta_value = pcab_business.ID
         ) as project_id 
FROM pcab_business 
LEFT JOIN pcab_categories4businesses 
    ON pcab_business.ID = pcab_categories4businesses.business_id 
WHERE user_id = 0;
▲ 0

@Akina, еще раз спасибо за рекомендации. В итоге ChatGPT со своей идеей насчет CONCAT победил. То есть, используя его идею и подкорректировав паттерн запроса, я получил искомый результат. Теперь запрос выглядит вот так:

SELECT `pcab_business`.`ID` as anonym_id, `pcab_business`.`business_name` as anonym_name, `pcab_categories4businesses`.`category_id` as category_id,  (SELECT `pcab_categories`.`category_name` FROM `pcab_categories` WHERE `pcab_categories`.`ID`=`pcab_categories4businesses`.`category_id`) as category_name,  (SELECT `pcab_projectmeta`.`project_id` FROM `pcab_projectmeta` WHERE `meta_key` = "anonim_professional_project" AND `meta_value` LIKE CONCAT('%["', anonym_id, '",%')) as project_id FROM `pcab_business` LEFT JOIN `pcab_categories4businesses` ON `pcab_business`.`ID`= `pcab_categories4businesses`.`business_id` WHERE `user_id` = 0

P.S. А заодно нашел ошибку и в той самой бизнес-логике, и внес исправление в кусок кода, который на малой выборке тестов отработал правильно. Черт, как же не хочется признавать, что AI помог!! ))))