2012-01-13 153 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