многостолбцовый поиск mysql - PullRequest
5 голосов
/ 10 февраля 2009

У меня есть такая таблица:
+-------------------+---------------+ | description | colour | +-------------------+---------------+ | Macrame Dress | Washed Black | | Darcelle Gilet | Dirty Shellac | | Darcelle Cardigan | Washed Black | | Let It Rot Vest | Optic White | | Let It Rot Crew | Washed Black | | Let It Rot Crew | Optic White | | Battalion Short | Somme | | Seine Dress | Washed Black | | Seine Dress | Cocomotion | | Odette V-neck | Linen Marl | +-------------------+---------------+ Я хочу найти «черное платье», и он возвращает только строки 1 и 8. Если я наберу «черный», он вернет строки 1, 3, 5 и 8. Платье должно вернуть строки 1, 8 и 9.

Может ли кто-нибудь придумать действительно элегантный, красивый кусочек SQL, который возьмет любое количество поисковых слов и вернет самый краткий набор результатов. Я могу придумать несколько уродливых способов сделать это, но они расстраивают мою карму.

Ответы [ 6 ]

3 голосов
/ 10 февраля 2009

Единственное хорошее решение (с точки зрения кармы), о котором я могу подумать, включает использование индекса FULLTEXT . Это позволит вам использовать такие запросы:

SELECT * FROM mytable
WHERE MATCH (description,color) AGAINST ('black dress');

К сожалению, для индексов FULLTEXT требуется табличный тип MyISAM, если я правильно помню.

EDIT

Я сомневаюсь, что это то, что вы ищете, но позвольте мне добавить это для обсуждения. Вы можете скопировать ваши данные во временную таблицу MyISAM и выполнить полнотекстовый поиск по этому номеру:

CREATE TEMPORARY TABLE mytmptable ENGINE=MyIsam SELECT * FROM mytable;
ALTER TABLE mytmptable ADD FULLTEXT KEY (description,color); 
SELECT * FROM mytmptable WHERE MATCH (description,color) AGAINST ('black dress');
1 голос
/ 10 февраля 2009
where colour+description like '%s1%'
0 голосов
/ 11 ноября 2013
$node=explode(" ",$keysearch);
$sql="SELECT * FROM tbl_dress WHERE ";
$x=0;
foreach ($node as $key => $ns) {
    $x++;
    if ($x > 1){$sql.=" AND ";}
    $sql.="(CONCAT(description, colour) LIKE '%$ns%')";
}
0 голосов
/ 14 сентября 2012

Ну, пока вы можете использовать PHP для сборки запроса, это должно работать:

SELECT * FROM tbl
WHERE (description LIKE '%black%' OR colour LIKE '%black%')
AND (description LIKE '%dress%' OR colour LIKE '%dress%')

... где вы добавляете одно из этих условий в скобках для каждого слова в поисковом запросе и соединяете их с помощью «И». Это требует совпадения по крайней мере в одном из столбцов для каждого слова в поисковом запросе.

Это не чистый SQL (фактический запрос будет зависеть от того, сколько слов содержится в поисковом запросе), но он выглядит разумно элегантным, и я думаю, что он должен справиться с работой.

0 голосов
/ 10 февраля 2009

Какой тип данных у вас в столбцах? Если они VARCHAR или аналогичные, вы просто сделаете

select 
  * 
from 
  tbl 
where 
  description like '%(s1)%' 
  or colour like '%(s1)%'

(Это адаптировано из @Pax, который, я считаю, неправильно понял вопрос - я понимаю, что он должен совпадать всякий раз, когда поисковый термин появляется в «описании» или «цвете»)

0 голосов
/ 10 февраля 2009

В идеале, я думаю, у вас было бы два отдельных критерия поиска, один для описания (s1) и один для цвета (s2).

Тогда ваш запрос становится:

select * from tbl where description like '%(s1)%' and colour like '%(s2)%'

Подставляя в значения для s1 и s2, конечно.

Пустой s2 приведет к %%, который должен соответствовать всем (я думаю).

Чтобы выполнить поиск по нескольким терминам в любом поле, вам нужно что-то вроде

select * from tbl
    where description + colour like '%(s1)%'
      and description + colour like '%(s2)%'
      and description + colour like '%(s3)%'

Это должно быть построено на лету, основываясь на количестве слов в вашем шаблоне поиска (таким образом, у «черного платья» будет s1 и s2, у черного будет просто s1). Бит "описание + цвет" - это объединенные поля; мой SQL немного заржавел, поэтому я не знаю, как бы вы это сделали, но концепция ясна.

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