2012-07-04 175 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