2012-07-04 102 views
2

我的表格包含pk_id,reviewer_id,rating。 有4種評分。通過不返回0值

1-very good. 
2-good. 
3-bad. 
4-very bad. 

我想計算每個評論者給出多少評分。 意思是: 如果Akee的id爲200給了不同的代碼2非常好,4好,3差和0非常差的評級。

我想導致

count--- rate 

    2---------1 

    4---------2 

    3---------3 

    0---------4 

我的查詢是

SELECT COUNT(RATE),RATE 
    FROM CODE_REVIEW WHERE CODE_REVIEWER_ID= 200 
GROUP BY RATE; 

它顯示的結果

count--- rate 

    2---------1 

    4---------2 

    3---------3 

我想說明的第四行是4等級爲零。 怎麼辦?

+0

的'Rate'必須是另一個表的主鍵? – manurajhada

+0

你有沒有定義費率的表格? – Jodrell

+0

提示:如果CODE_REVIEW表中沒有RATE = 4,那麼mysql如何知道它應該返回行(0,4)? –

回答

1

如果費用是不是在另一個表,那麼你需要定義自己的費率表因此MySQL知道什麼rate的排列是主鍵:

SELECT Rates.Rate, 
     COUNT(Code_Review.Rate) AS CountOfRate 
FROM ( SELECT 1 AS Rate UNION ALL 
      SELECT 2 AS Rate UNION ALL 
      SELECT 3 AS Rate UNION ALL 
      SELECT 4 
     ) AS Rates 
     LEFT JOIN Code_Review 
      ON Code_Review.Rate = Rates.Rate 
      AND CODE_REVIEWER_ID = 200 
GROUP BY Rates.Rate 
+1

這不起作用。 'COUNT(*)'只是計算一行的存在。由於'4' *在第一個子查詢中作爲一行存在,所以即使用戶從未投過票,計數也總是> 1。4.您必須做的是讓它計入'LEFT JOIN'中的某一列'編輯表,因爲'NULL'並不包含在COUNT()總數中。 –

+0

@ZaneBien好點。編輯我的答案。 – GarethD

0

假設您沒有定義費率的單獨表格。

SElECT * from (
    SELECT distinct(m.rate), countrate from code_review m 
    LEFT JOIN 
    (SELECT COUNT(rate) as countrate,rate FROM code_review 
    WHERE code_reviewer_id=200 GROUP BY rate) t 
    ON m.rate=t.rate) a 
+2

只是FYI:DISTINCT不是一個函數,它應用於整行。將括號中的DISTINCT旁邊的列括起來並不會改變這一事實。 –

0

如果可以的話,你應該推設法得到它在列的格式,因爲它是簡單的:

SELECT 
    SUM(rate = 1) AS 1, 
    SUM(rate = 2) AS 2, 
    SUM(rate = 3) AS 3, 
    SUM(rate = 4) AS 4 
FROM 
    code_review 
WHERE 
    code_reviewer_id = 200 

但如果你真的需要一個行格式,你可以這樣做:

SELECT 
    a.rate, 
    COUNT(b.rate) AS cnt 
FROM 
    (
     SELECT 1 AS rate UNION ALL 
     SELECT 2 AS rate UNION ALL 
     SELECT 3 AS rate UNION ALL 
     SELECT 4 AS rate 
    ) a 
LEFT JOIN 
    code_review b ON a.rate = b.rate AND code_reviewer_id = 200 
GROUP BY 
    a.rate 
0

你可以做財產以後這樣

SELECT 
      rates.RATE 
      , SUM(COUNT) COUNT 
    FROM 
      (
      SELECT 1 RATE, 0 COUNT UNION ALL 
      SELECT 2 RATE, 0 COUNT UNION ALL 
      SELECT 3 RATE, 0 COUNT UNION ALL 
      SELECT 4 RATE, 0 COUNT 
      ) Rates 
     LEFT JOIN 
      (
       SELECT 
         RATE 
         , COUNT(RATE) COUNT 
        FROM 
         CODE_REVIEW 
        WHERE 
         CODE_REVIEWER_ID= 200 
        GROUP BY RATE 
      ) Ratings200 
      ON Ratings200.RATE = Rates.RATE 
0

嘗試此查詢:

SELECT coalesce(c.cnt, 0), r.rate 
    FROM (SELECT 1 AS rate UNION ALL SELECT 2 
     UNION ALL SELECT 3 UNION ALL SELECT 4) AS r 
    LEFT JOIN (SELECT COUNT(RATE),RATE 
      FROM CODE_REVIEW WHERE CODE_REVIEWER_ID= 200 
     GROUP BY RATE) AS c 
    ON r.rate = c.rate; 
  1. 第一子查詢產生的可能率列表。如果你有一個定義所有費率的表格,你可以避免它;
  2. 第二個子查詢是你的;
  3. LEFT JOIN保證所有費率都會顯示;
  4. coalesce()是需要NULL轉換成0。
+0

It works.Thanks很多。 – akeeseth

0
SELECT 
    Rate, 
    totCount 
FROM 
(
    Select 
     Rate, 
     count(Rate) as totCount 
    from 
     Code_Review 
    where 
     CODE_REVIEWER_ID = 200 
    group by 
     Rate 
    union 
    select 4, 0 
    union 
    select 3, 0 
    union 
    select 2, 0 
    union 
    select 1, 0 
) AS T 
group by 
    T.Rate