2011-12-31 33 views
0

這裏是我的查詢mysql命令通過與工會重複結果

(SELECT *, 1 as ob FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only three doors%" OR `joke` LIKE "%only three doors%")) 
UNION 
(SELECT *, 2 as ob FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only%" OR `joke` LIKE "%only%")) 
UNION 
(SELECT *, 3 as ob FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%three%" OR `joke` LIKE "%three%")) 
UNION 
(SELECT *, 4 as ob FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%doors%" OR `joke` LIKE "%doors%")) 
ORDER BY `ob` ASC, `ups` DESC,`downs` ASC LIMIT 0, 30 

現在我的這個問題是我得到重複的結果。有沒有辦法修改這個,所以我不會重複。

選擇的順序比起起落落更重要。

我還想指出,選擇語句的數量會發生變化。

回答

1
SELECT jokes.* 
    , CASE WHEN title LIKE '%only three doors%' 
       OR joke LIKE '%only three doors%' 
       THEN 1 
      WHEN title LIKE '%only%' 
       OR joke LIKE '%only%' 
       THEN 2 
      WHEN title LIKE '%three%' 
       OR joke LIKE '%three%' 
       THEN 3 
      ELSE 4 
     END as ob 
FROM jokes 
WHERE flags < 5 
    AND (title LIKE '%only%' 
    OR joke LIKE '%only%' 
    OR title LIKE '%three%' 
    OR joke LIKE '%three%' 
    OR title LIKE '%doors%' 
    OR joke LIKE '%doors%' 
    ) 
ORDER BY ob ASC 
     , ups DESC 
     , downs ASC 
LIMIT 0, 30 
+0

看起來沒問題,直到標誌狀態之後的部分。這甚至是必要的嗎? – 2011-12-31 03:49:38

+0

另外,如果它不能滿足案件中的任何條件,我不希望它。因此,擁有else 4語句將只抓取其餘的行不會,並將它們添加到最後?我可以把這條線拿出來嗎? – 2011-12-31 04:17:45

+0

'ELSE 4'適用於'title LIKE'%doors%'或笑話LIKE'%doors%''的情況 – 2011-12-31 10:53:04

0

你很明顯會得到重複的結果,因爲你正在SELECT *之後的文字數值中加入。

這將使每行不同,所以UNION將無法​​刪除其他重複的行。

+0

我知道這一切。我問是否有人知道如何使這項工作沒有重複。 – 2011-12-31 00:42:26