2011-06-20 46 views
1
 
SELECT rideid, year, model, rating, SUM(Relevance) as SearchRelevance 
FROM( 
SELECT rideid, year, model, rating, 1 as Relevance FROM cars 
WHERE cat LIKE '%$keyword%' 
UNION ALL 
SELECT rideid, year, model, rating, 1 as Relevance FROM cars 
WHERE cat2 LIKE '%$keyword2%') 
AS t GROUP BY rideid ORDER BY SUM(Relevance) DESC "; 

大家好,我在其他成員的幫助下得到了這個很棒的查詢,它在基於相關係統對結果進行排序時非常有效。因此,當我的兩個搜索條件都滿足時,這些結果將首先排序。僅限於相關結果 - MYSQL

問題是顯示結果中顯示不符合兩個標準(僅匹配1個標準)的結果,但是以較低的順序顯示。我想實際上垃圾清除這些結果,有沒有一種方法來優化此查詢,以便返回的唯一結果是滿足這兩個條件的結果?

將LIKE更改爲=不是一個選項,因爲結果字段是textareas,因此mysql需要在textareas中搜索關鍵字。

謝謝

+0

那些「$關鍵字」和「$關鍵字2」值是否來自用戶輸入?確保你沒有在這個查詢中引入SQL注入漏洞。 – Wyzard

回答

0

你可以只添加HAVING SUM(Relevance) = 2到外SELECT,只是GROUP BY rideid後,因爲Relevance是多少的標準相匹配的計數。 (如果稍後添加更多條件,則需要用更大的數字替換2以匹配。)

但是,您也可以用更簡單的方式編寫整個查詢:刪除子選擇和UNION ALL,只是做WHERE cat LIKE '%$keyword%' AND cat2 LIKE '%$keyword2%'。子選擇和UNION的全部要點是爲了獲得僅匹配一個或另一個的結果。

+0

添加HAVING SUM不適用於我,不幸的是,只是一個標準的1064 mysql錯誤。我會按照你的建議嘗試重寫,但是我希望保持有時具有較少相關結果的靈活性(取決於用戶在表單上查看的內容) – Mark

+0

對不起,你對HAVING的位置是正確的,我犯了一個錯誤此前,這個作品,謝謝! – Mark

0

我缺少的東西,或者你總是會得到SUM(關聯性)= 2匹配兩個條件的記錄?

+0

是的,你會得到這兩個匹配= 2,但MySQL仍然會返回其他結果,只是訂購較低。 – Mark

+0

如果我是對的,並且你想通過在文本中找到關鍵字的次數來計算相關性,你應該看看[示例如何在文本中獲取子字符串計數](http://nostylesheets.com/2009/07/17/MySQL的-SUBSTR計數/)。 – Gedrox

0

試試這個:

SELECT rideid, year, model, rating, SUM(Relevance) SearchRelevance 
FROM( 
    SELECT rideid, year, model, rating, 1 as Relevance FROM cars 
    WHERE cat LIKE '%$keyword%' 
    UNION ALL 
    SELECT rideid, year, model, rating, 1 as Relevance FROM cars 
    WHERE cat2 LIKE '%$keyword2%' 
) AS t 
HAVING SearchRelevance > 1 
GROUP BY rideid 
ORDER BY SearchRelevance DESC 
+0

這不起作用,錯誤代碼:'where子句'中的未知列'SearchRelevance' – Mark

+0

@Mark:對不起,更新我的答案,嘗試一個代碼。 – Shef

+0

謝謝!我將這個與Wyzard的建議結合使用,它很有用! – Mark

1
SELECT rideid, year, model, rating, SUM(Relevance) as SearchRelevance 
     FROM( 
     SELECT rideid, year, model, rating, 2 as Relevance FROM cars 
      WHERE cat LIKE '%$keyword%' AND cat2 LIKE '%$keyword2%') 
     AS t GROUP BY rideid ORDER BY SUM(Relevance) DESC 
+0

+1用於刪除聯合,但您可能也可以擺脫外部選擇和組合子句。然而,如果OP正在尋找相關> 2的話,它也可能不起作用 –