Как использовать псевдоним (алиас) в шаблоне LIKE MySQL
коллеги!
Вопрос про вот такой 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.
Ответы (2 шт):
Если почистить запрос от 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;
@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 помог!! ))))