2015-05-23 36 views
1

我想分類產品的評論放在圖表中。總結成績,我打破的結果集分爲四個夾頭:按條件聯合SQL請求:丟失行?聯盟失敗?

Score >= 4.5 
Score < 4.5 && Score >= 4 
Score < 4 && Score >= 3 
Score < 3 

的SQL請求可以在下面看到:

SELECT DISTINCT COUNT(*) AS cnt 
    FROM reviews 
    WHERE score >= 4.5 
    AND id = 4 
    AND live = '1' 
UNION 
SELECT DISTINCT COUNT(*) AS cnt 
    FROM reviews 
    WHERE score >= 4 
    AND score < 4.5 
    AND id = 4 
    AND live = '1' 
UNION 
SELECT DISTINCT COUNT(*) AS cnt 
    FROM reviews 
    WHERE score >= 3 
    AND score < 4 
    AND id = 4 
    AND live = '1' 
UNION 
SELECT DISTINCT COUNT(*) AS cnt 
    FROM reviews 
    WHERE score < 3 
    AND id = 4 
    AND live = '1' 

這一操作將在陣列中放。我注意到上面的請求返回行,或計數的總和等於13.我得到的結果如下:

做以下請求......

SELECT score 
    FROM reviews 
    WHERE live = '1' 
    AND id = 4 

...返回14行。我想也許結果集可能會導致問題,但我沒有看到任何結果。該組得分如下:

5.0,5.0,5.0,5.0,4.9,4.9,4.9
4.8,4.8,4.7,4.4,4.2,3.4,2.6

I」米不知道爲什麼單行缺失,任何想法,也許我的語法不符合?爲什麼最後的聯盟(score < 3)沒有任何回報?

+0

如果你只想根據分數範圍來計數評論,那麼一個案例組可以比聯盟快得多。 – Tim3880

+0

您可以刪除DISTINCT,因爲COUNT(*)無總是返回一行。 – jarlh

回答

1

另外,跳過UNION,而是使用CASE做conditonional計數:

SELECT COUNT(case when Score >= 4.5 then 1 end) AS score_gt_4p5, 
     COUNT(case when Score < 4.5 AND Score >= 4 then 1 end) AS score_4_to_4p5, 
     COUNT(case when Score < 4 AND Score >= 3 then 1 end) AS score_3_to_4, 
     COUNT(case when Score < 3 then 1 end) AS score_lt_3 
FROM reviews 
WHERE id = 4 
    AND live = '1' 

這樣的表將只讀取一次!