2016-11-14 7 views
1

Скажем, у меня есть таблица вроде этого:Получить наиболее соответствует результат на вершине в MySQL LIKE запроса

Таблица: businesses

+----+------------------------+ 
| id | name     | 
+----+------------------------+ 
| 1 | Carolyn Wong Cakes  | 
| 2 | Cupcakin Cackes Shop | 
| 3 | Wong Cackes Shop  | 
| 4 | Indie Cakes & Pastries | 
+----+------------------------+ 

Я хочу, чтобы получить best matched result в то время как я ищу для некоторых слов внутри имени. Например, я хочу найти: Wong Cackes Shop который составляет 3 слова.
Я использую этот запрос для поиска выше:

SELECT * FROM businesses WHERE ( 
    name LIKE '% Wong %' OR 
    name LIKE '% Cackes %' OR 
    name LIKE '% Shop %' 
) 

Я ожидаю record 3 быть первым соответствуют результату, но результат:

  1. Carolyn Wong Cakes // с 2 согласующимися словами
  2. Cupcaking Cackes Shop // с 2 соответствующие слова
  3. Wong Cackes Shop // с 3 соответствующие слова

Как я могу искать слова и получать записи с большинством согласованных результатов поверх других результатов?

Как это:

  1. Wong Cackes Shop // с 3 согласующихся слов
  2. Cupcaking Cackes Shop
  3. Carolyn Wong Cakes

EDIT: Мой word-boundaries LIKE метод также имеет проблемы. он не получит результатов, которые начинаются или заканчиваются одним из трех слов. из-за тех, кто spaces в LIKE '% word %'
, например:
Wong[space] // не соответствует
[space]Wong[space] матч
[space]Wong // не соответствует

Спасибо.

+0

вопрос напоминает другой вопрос: http://stackoverflow.com/questions/23153515/mysql-count-number-of-like-matches-per-entry – Bee157

+0

вы смотрели на индексы FULLTEXT ли ? – Strawberry

+0

@Strawberry мой настольный двигатель 'innoDB'. поддерживает ли он FULLTEXT? – Pars

ответ

2

следующие должны сделать трюк

SELECT 
    name, 
    ((name LIKE '%Wong%')+(name LIKE '%Cackes%') +(name LIKE '%Shop%')) as total 
FROM businesses WHERE ( 
    name LIKE '%Wong%' OR 
    name LIKE '%Cackes%' OR 
    name LIKE '%Shop%' 
) 
ORDER BY total DESC 

Вы даже можете удалить, где положение здесь, так как вы просто интересуется общим количеством просмотров.
Чтобы преодолеть проблему пространства, просто устраните их в подобных предложениях. %wong% будет соответствовать [space]wong ИЛИ [space]wong[space] или wong[space]

+0

Не могли бы вы посмотреть отредактированный пост. проблема с пробелами в подобном запросе. – Pars

+0

спасибо. это решило проблему. – Pars

+0

@ Bee157, После устранения пространства, он создает проблемы типа «Мастерская». Эти слова означают по-разному и будут включены в верхние страницы результата поиска. – Michael

0

Это делается правильно, так как он будет искать только слово. В вашем случае, вы должны искать для всей строки Wong Cackes Shop (OR) лучше бы реализующего FULL TEXT поиска