Вы должны разделить и присоединить свой поисковый запрос на стороне PHP
следующим образом:
<?php
$words = preg_split("/[^\\w]+/", $q);
$first = $words[0] + "%";
$all = implode(" ", $words) + "%";
?>
, а затем использовать переменные $first
и $all
в этом запросе:
SELECT p.prd_name, d.description
FROM product p
JOIN description d
ON d.prd_cod = p.prd_cod
WHERE p.prd_name LIKE '$first'
AND CONCAT(p.prd_name, ' ', d.description) LIKE '$all'
Создайте индекс для product (prd_name)
, чтобы он работал быстро.
Если вы хотите, чтобы слова соответствовали в любом порядке, вам нужно будет создать индекс FULLTEXT
для ваших таблиц (это возможно только вMyISAM
):
CREATE FULLTEXT INDEX fx_product_name ON product (prd_name)
CREATE FULLTEXT INDEX fx_description_name ON description (description)
и напишите запрос следующим образом:
SELECT p.prd_name, d.description
FROM (
SELECT prd_cod
FROM product pi
WHERE MATCH(prd_name) AGAINST ('lcd tv' IN BOOLEAN MODE)
UNION
SELECT prd_cod
FROM description di
WHERE MATCH(description) AGAINST ('lcd tv' IN BOOLEAN MODE)
) q
JOIN product p
ON p.prd_cod = q.prd_cod
JOIN description d
ON d.prd_cod= p.prd_cod
WHERE MATCH(p.prd_name, d.description) AGAINST ('+lcd +tv' IN BOOLEAN MODE)
Обратите внимание на изменение синтаксиса поискового термина: 'lcd tv'
во внутреннем запросе и '+lcd +tv'
ввнешний.
Вы также можете установить @@ft_min_word_len
в 1
для более коротких слов, таких как tv
или gps
, для соответствия.
Так как MySQL
не может построитьполнотекстовый индекс из двух или более таблиц одновременно, было бы проще, если бы вы денормализовали свои таблицы и поместили prd_name
в таблицу description
.Таким образом, вы можете избавиться от объединений и просто написать:
SELECT prd_name, description
FROM description d
WHERE MATCH(prd_name, description) AGAINST ('+lcd +tv' IN BOOLEAN MODE)