2012-07-18 90 views
0

我有以下SQL語句:SQL全文匹配值只返回布爾值(1或0),匹配的項目

SELECT 
    g.*, 
     (
      MATCH (g.GameTitle) AGAINST ('call of duty') 
      OR g.GameTitle SOUNDS LIKE 'call of duty' 
     ) 
    AS MatchValue, 
    p.id AS platformid, 
    p.alias AS PlatformAlias, 
    p.name, 
    p.icon 
FROM 
    games AS g, 
    platforms AS p 
WHERE 
    (
     (
      MATCH (g.GameTitle) AGAINST ('call of duty') 
      OR g.GameTitle SOUNDS LIKE 'call of duty' 
     ) 
     OR 
     (
      MATCH (g.Alternates) AGAINST ('call of duty') 
      OR g.Alternates SOUNDS LIKE 'call of duty' 
     ) 
    ) 

AND g.Platform = p.id 
ORDER BY MatchValue DESC 

它返回一個正確的一組針對全文索引匹配時的結果,但是所報告的「MatchValue」僅具有布爾性質(0或1)。

如果我去掉語句的第5行:

OR g.GameTitle SOUNDS LIKE 'call of duty' 

我得到體面的匹配值從身邊說要5.23 15.56,但反對「候補」的匹配時,我失去了一些功能。

我不是輝煌與SQL,它採取了我幾天的時間才能得到它運行這麼多...

是否有返回非布爾值匹配,使得任何方式來獲得線5和6我的結果是正確的命令?

在此先感謝;)

+0

您如何期待確定'g.GameTitle SOUNDS LIKE'任務調用'(或本質上,'SOUNDEX(g.GameTitle)')的相關值,該值與'MATCH'返回的相關性值有意義地相關並可以在它們之間進行排序? – Wiseguy 2012-07-18 14:52:49

+0

看來我錯誤地認爲SOUNDEX返回了一個相關性值,也許我把它和其他東西混淆了......感謝您的澄清:) – flexage 2012-07-18 15:42:48

回答

0

當你說'ABC' OR (3 > 2)你所要求的一個BOOL結果。你不能得到一個字符串或布爾值。在上述情況下,字符串'abc'轉換爲布爾型,因爲它不代表數字。

因爲它不OR多大意義荷蘭國際集團字符串和布爾,我會分隔兩個:

SELECT 
    g.*, 
     (
      MATCH (g.GameTitle) AGAINST ('call of duty') 
      OR g.GameTitle SOUNDS LIKE 'call of duty' 
     ) 
    AS MatchResultBoolean, 
    MATCH (g.GameTitle) AGAINST ('call of duty') AS MatchText, 
    p.id AS platformid, 
    p.alias AS PlatformAlias, 
    p.name, 
    p.icon 
FROM 
    games AS g, 
    platforms AS p 
WHERE 
    (
     (
      MATCH (g.GameTitle) AGAINST ('call of duty') 
      OR g.GameTitle SOUNDS LIKE 'call of duty' 
     ) 
     OR 
     (
      MATCH (g.Alternates) AGAINST ('call of duty') 
      OR g.Alternates SOUNDS LIKE 'call of duty' 
     ) 
    ) 

AND g.Platform = p.id 
ORDER BY MatchValue DESC 

注意的變化:

 (
      MATCH (g.GameTitle) AGAINST ('call of duty') 
      OR g.GameTitle SOUNDS LIKE 'call of duty' 
     ) 
    AS MatchResultBoolean, 
    MATCH (g.GameTitle) AGAINST ('call of duty') AS MatchText, 

這樣,你得到它的兩個方法:一次你得到布爾值,在另一列你得到(可能)匹配。

+0

感謝您向我解釋這一點,它使您更有意義。 我想如果我希望能夠在我的應用程序中包含這兩種類型的匹配,並按相關性對這個混合集合進行排序,我可以從上面提供的查詢中得到結果,並將它們全部粘貼到一個PHP數組(或等價物)並根據初始搜索字符串對它們執行排序... 雖然我們談論了這個主題,但我不認爲你知道一個庫/腳本或某些資源可以完成這種類型的相關排序在PHP中? 再次感謝您的幫助! ;) – flexage 2012-07-18 15:44:29

+1

我可能是一個過度延伸,但[sphinxsearch](http://sphinxsearch.com/)是一個非常強大的搜索引擎。儘管如此,這會使你的東西變得相當複雜。 – 2012-07-18 16:40:25