2012-01-13 6 views
1

У меня сложнее всего работать с функцией поиска php (или mysql). Я бы хотел купить для этого скрипт, но я не могу найти его.Комплексный поиск PHP/MySQL с несколькими ключевыми словами

У меня есть таблица клиентов (имя, фамилия, улица, почтовый индекс, город и т. Д.) , и я хотел бы иметь возможность не просто искать одно ключевое слово, но и 2 IN 2 DIFFERER columns.

, например:

Ключевое слово: "John Doe"

Так что моя попытка была.

SELECT .... 
    WHERE CONCAT(firstname,lastname) LIKE '%john%' 
    AND CONCAT(firstname,lastname LIKE '%doe%' 

Однако: что дает мне обратно всем джон и делает, и г-н Джон Доу находится где-то в этом списке, но не на вершине, несмотря на то, что он должен быть наиболее значимым результатом.

Я также попытался:

.... 
    WHERE MATCH(firstname,lastname) AGAINST('%john doe%') 

И это в значительной степени возвращает тот же результат.

Так что результат я ищу будет:

1. John Doe (at first position!) 
2. John Miller 
3. John Smith 
4. Harry Doe 
5. Jack Doe 
etc...... 

Я искал в течение 2 часов и я отказываюсь верить, что я первый человек, который когда-либо пытался сделать это :-)

Любая помощь приветствуется!

Спасибо!

ответ

0

Нравится?

SELECT 
    firstname, lastname, othercol, MIN(Weighting) 
FROM 
    (
    SELECT firstname, lastname, othercol, 1 AS Weighting FROM... 
    WHERE firstname = 'john' AND lastname = 'doe' 
    UNION ALL 
    SELECT firstname, lastname, othercol, 2 AS Weighting FROM... 
    WHERE firstname = 'john' OR lastname = 'doe' 
    ) T 
GROUP BY 
    firstname, lastname, othercol 
ORDER BY 
    MIN(Weighting) DESC; 
+0

да, но что, если кто-то входит «лань Джон»? –

+0

@Roman Кларе: обновите свой вопрос. Я ответил, что вы попросили – gbn

0

Логическое режим не автоматически сортировать строки в порядке убывания релевантности, так что вы должны:

SELECT MATCH(firstname,lastname) AGAINST('john doe') as Relevance FROM table WHERE MATCH 
MATCH(firstname,lastname) AGAINST('john doe' IN 
BOOLEAN MODE) ORDER 
BY Relevance DESC 
3

Вы также можете попробовать что-то вроде этого

SELECT MATCH(firstname, lastname) AGAINST ('john doe') as Relevance 
FROM table WHERE MATCH(firstname, lastname) AGAINST('john doe' IN 
BOOLEAN MODE) 
HAVING Relevance > 0.3 
ORDER BY Relevance DESC 

смотри также

http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

Это может быть также решение:

SELECT MATCH(firstname) AGAINST ('john doe') as firstname_relevance, 
    MATCH(lastname) AGAINST ('john doe') as lastname_relevance 
    FROM table WHERE MATCH(firstname, lastname) AGAINST('john doe' IN 
    BOOLEAN MODE) 
    ORDER BY firstname_relevance+lastname_relevance DESC 
+0

WOW! Большое спасибо :-) –

+0

Да, я пробовал это на самом деле, –

+0

, но все же john doe не на первой позиции. есть и другие «дочки», имеющие более высокую актуальность. i kinda не понимаю, что –

Смежные вопросы