2012-01-13 196 views
1

我在使用php(或mysql)搜索功能時遇到了最困難的時間。 我願意爲此購買劇本,但我找不到任何劇本。帶有多個關鍵字的PHP/MySQL複雜搜索

我有一個客戶表(名字,姓氏,街道,郵編,城市等...) 我希望能夠不只是尋找一個關鍵字,但2 INN 2不同列。

例如:

關鍵詞: 「李四」

所以我嘗試了。

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

是的,但如果有人進入「母鹿約翰」是什麼? – 2012-01-13 11:26:29

+0

@Roman Klare:然後更新你的問題。我回答了你問的問題 – gbn 2012-01-16 10:09:18

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! 非常感謝:-) – 2012-01-13 11:10:33

+0

是啊我試過,其實, – 2012-01-13 11:17:39

+0

但仍john doe不在第一的位置。還有一些其他的「doe」具有更高的相關性。 我有點不明白 – 2012-01-13 11:18:07