2009-10-19 25 views
34

我在名爲'cards'的INNODB表中有大約20,000行,所以FULLTEXT不是一個選項。MySQL - 如何按相關性排序? INNODB表

請考慮此表:

id  |  name  |  description 
---------------------------------------------------------- 
1  John Smith  Just some dude 
2  Ted Johnson  Another dude 
3  Johnathan Todd This guy too 
4  Susan Smith  Her too 
5  Sam John Bond And him 
6  John Smith  Same guy as num 1, another record 
7  John Adams  Last guy, promise 

所以說,用戶搜索「約翰」,我想結果集是在順序:

7  John Adams 
6  John Smith 
3  Johnathan Todd 
5  Sam John Bond 
2  Ted Johnson 

請注意,我們'只是拉了'約翰史密斯'一次,我們拿了他最近的參賽作品。由於我的數據,所有的名字都是同一個人,不需要擔心約翰史密斯這兩個不同的人。 想法?讓我知道我是否可以澄清任何事情。

+1

你似乎想通過 「姓,名」 命令,而不是由相關性(但是你定義)。它是否正確? – Tomalak 2009-10-19 13:47:56

回答

110

版本1:

SELECT max(id) id, name 
    FROM cards 
WHERE name like '%John%' 
GROUP BY name 
ORDER BY CASE WHEN name like 'John %' THEN 0 
       WHEN name like 'John%' THEN 1 
       WHEN name like '% John%' THEN 2 
       ELSE 3 
      END, name 

版本2:

SELECT max(id) id, name 
    FROM cards 
WHERE name like '%John%' 
GROUP BY name 
ORDER BY CASE WHEN name like 'John%' THEN 0 
       WHEN name like '% %John% %' THEN 1 
       WHEN name like '%John' THEN 2 
       ELSE 3 
      END, name 
+0

太棒了!這和我想要的完全一樣。感謝najmeddine! – k00k 2009-10-19 14:01:08

+1

很樂意幫忙。我修改了一下,以處理更多的案件。 – manji 2009-10-19 14:23:36

+0

我認爲在我的具體情況下,另一種方式可以更好地發揮作用,但它們都可能對別人有所幫助,你能否爲了後人的緣故而把它們放在那裏? – k00k 2009-10-19 16:01:51