Расширенный поисковый запрос MySQL - с помощью RLIKE
Я работаю над поисковым запросом MySQL для модуля поиска товаров в Joomla/Virtuemart. Я на самом деле пытаюсь изменить существующий запрос MySQL с использованием MATCH / AGAINST на использование RLIKE, но мой измененный запрос дает ошибки..
Вот оригинальный запрос с MATCH / AGAINST, который не содержит ошибок:
$searchstring = " +search* +string* +test*";
$query ="SELECT p.virtuemart_product_id, l.product_name from #__virtuemart_products AS p, #__virtuemart_products_".VMLANG." AS l WHERE MATCH(product_name,customtitle) AGAINST ('".$searchstring."' IN BOOLEAN MODE) AND p.published = '1' AND p.virtuemart_product_id = l.virtuemart_product_id LIMIT 0,".$prods." union (select p.virtuemart_product_id, l.product_name from #__virtuemart_products AS p, #__virtuemart_products_".VMLANG." as l where MATCH(product_sku) AGAINST ('".$searchstring."' IN BOOLEAN MODE) and p.published = '1' and p.virtuemart_product_id = l.virtuemart_product_id LIMIT 0,".$prods.")";
Вот мой измененный запрос с использованием RLIKE:
$searchstring = "search|string|test";
$query ="SELECT p.virtuemart_product_id, l.product_name from #__virtuemart_products AS p, #__virtuemart_products_".VMLANG." AS l WHERE product_name,customtitle RLIKE '".$searchstring."' AND p.published = '1' AND p.virtuemart_product_id = l.virtuemart_product_id LIMIT 0,".$prods." union (select p.virtuemart_product_id, l.product_name from #__virtuemart_products AS p, #__virtuemart_products_".VMLANG." as l where product_sku RLIKE '".$searchstring."' and p.published = '1' and p.virtuemart_product_id = l.virtuemart_product_id LIMIT 0,".$prods.")";
У меня нет идей относительно того, почему поисковый запрос RLIKE не работает. Я надеюсь, что кто-то может указать, что я делаю не так здесь..
1 ответ
Решение
У вас есть странное выражение в вашем запросе:
WHERE product_name, customtitle RLIKE '".$searchstring."'
Попробуйте объединить их, используя concat()
первый:
(SELECT p.virtuemart_product_id, l.product_name
from #__virtuemart_products p join
#__virtuemart_products_".VMLANG." l
on p.virtuemart_product_id = l.virtuemart_product_id
WHERE concat(product_name, customtitle) RLIKE '".$searchstring."' AND
p.published = '1'
LIMIT 0,".$prods."
)
union
(select p.virtuemart_product_id, l.product_name
from #__virtuemart_products p join
#__virtuemart_products_".VMLANG." l
on p.virtuemart_product_id = l.virtuemart_product_id
where product_sku RLIKE '".$searchstring."' and
p.published = '1'
LIMIT 0,".$prods.
)
Вы также можете сравнить каждый из них в отдельности:
WHERE (product_name RLIKE '".$searchstring."' OR
customtitle RLIKE '".$searchstring."'
) AND . . .
Обратите внимание, что я также исправил join
синтаксис для использования явных объединений.