2011-12-27 54 views
0

好了,所以我有查詢MySQL的計數結果UNION不重疊

(SELECT * FROM jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) ORDER BY ups DESC,downs ASC) 
UNION 
(SELECT * FROM jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) ORDER BY ups DESC,downs ASC) 
UNION 
(SELECT * FROM jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) ORDER BY ups DESC,downs ASC) 
LIMIT 0, 30 

,我會運行使用COUNT(*)同樣的事情沒有限制

(SELECT COUNT(*) FROM jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) ORDER BY ups DESC,downs ASC) 
UNION 
(SELECT COUNT(*) FROM jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) ORDER BY ups DESC,downs ASC) 
UNION 
(SELECT COUNT(*) FROM jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) ORDER BY ups DESC,downs ASC) 

基本上我想什麼do是得到總結果的數量(沒有限制),並且也得到有限的列表。

我遇到的問題是,當我運行計數查詢時,我得到的數字比我回來的結果更大。我猜測的原因是當我得到結果時,它會過濾出所有重疊的行,因爲計數只計算每個行,因爲我手動添加它們。

關於如何清理整個過程的任何想法?

此外,請注意,選擇語句的數量動態變化,但我希望有一種方法來獲得一個統計重複的帳戶。

謝謝。

回答

1

這個怎麼樣了字數:

SELECT COUNT(DISTINCT Id) 
FROM (SELECT Id From jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) 
     UNION 
     SELECT Id From jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) 
     UNION 
     SELECT Id From jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?)) t 

這應該給你獨特的計數,並且還注意到,我得到,因爲它是不值得計算的計數查詢擺脫秩序。

+0

有道理。這看起來不錯,我會試試看。 – 2011-12-27 01:29:53

+1

得到這個錯誤 每個派生表必須有它自己的別名 – 2011-12-27 01:42:37

+0

好吧添加'作爲計數'到最後,並清除它 – 2011-12-27 01:47:41