2016-03-08 42 views
2

我有以下代碼:當使用OR給出兩個條件時,如何在MYSQL中設置條件的優先級?

$sqlquery1 = "SELECT * 
       FROM item 
       WHERE item.title LIKE '%abc%' 
        OR item.idescription LIKE '%abc%'"; 

,這是完全運行。

唯一值得關注的是,我想先顯示第一個OR條件(item.title)的結果,後面是下一個條件。

例如電流輸出:

名稱:代數
描述:ABC INC

名稱:ABC
描述:dsdsinc

名稱:鋁ABC廣告
說明:SDS公司所需的輸出的

如:

標題:ABC
說明:dsdsinc

名稱:鋁ABC廣告
說明: sds inc

標題:代數
說明:ABC INC

回答

1

對其他答案進行擴展,您可能希望對titledescription中術語出現的位置進行排名,然後僅對title中的術語進行排名。

SELECT * , title_score + description_score AS total_score 
FROM (
    SELECT * , title LIKE '%abc%' AS title_score, description LIKE '%abc%' AS description_score 
    FROM item 
    WHERE title LIKE '%abc%' 
OR description LIKE '%abc%' 
) AS temp_tbl 
ORDER BY total_score DESC, title_score DESC, description_score DESC 

除了這些答案,你可以使用一個FULLTEXT指數與score結果,將根據期限被發現的次數排名搜索。

SELECT * , MATCH(title, description) AGAINST ('*abc*') AS score 
    FROM item 
    WHERE MATCH(title, description) AGAINST ('*abc*' IN BOOLEAN MODE) 
    ORDER BY score DESC 
7

如果你想排在一個特定的順序返回,添加ORDER BY條款。

爲了滿足規定的規格,這將是足夠的:

ORDER BY item.title LIKE '%abc%' DESC 

這工作,因爲MySQL計算一個布爾表達式並返回結果爲整數:TRUE返回爲1,FALSE返回爲0,並且NULL或未知被返回爲NULL。我們可以用簡單的測試來證明這一點,例如

SELECT 'abc' LIKE '%abc%' 
    , 'foo' LIKE '%abc%' 
    , NULL LIKE '%abc%' 

並看到MySQL分別返回1,0和NULL。

就個人而言,我更希望在ORDER BY中使用更多表達式來使結果更具確定性,以確保行按照可預測和可重複的順序返回。

2

您可以爲每個匹配條件和順序分配一個值。當你這樣做,這是很好的有一個「打破平局」命令,這樣你就不會得到所有的標題與隨機排序,然後所有的描述相匹配隨機排序:

SELECT * 
FROM item 
WHERE item.title LIKE '%abc%' OR item.idescription LIKE '%abc%' 
ORDER BY 
    CASE(WHEN item.title like '%abc%' THEN 1 ELSE 0 END), 
    item.title, 
    item.description; 

這類似於spencer7593的解決方案,除了可以擴展以處理兩個以上的「或」條件(如果需要的話)。