2010-01-26 88 views
0

请,问题与SQL添加

我想获得一些用户赢得点的总数值很少有区别的计数,但一切都从同一张表。

SQL:

SELECT o.author_id, SUM(o.vote_value) AS vote_value, n.best AS best_sum, 
       (SUM(o.vote_value) + (10 * n.best)) AS total 
       FROM comments o 
       LEFT JOIN (
        SELECT COUNT(best) AS best, author_id 
        FROM comments 
        WHERE best = 1 
        GROUP BY author_id 
       ) n ON o.author_id = n.author_id 
       GROUP BY o.author_id 
       ORDER BY total DESC 
       LIMIT 0, 4 

问题是,如果没有最好的(默认为0,并且最好是1)我得到了什么 “总” 和 “best_sum”。我需要0,如果用户没有“最好的”,这样的计算可以正确执行

对不起,我的英文不好,我认为你会明白 感谢

回答

0

我认为你的问题是你筛选出最好不是1的行,所以它们不包含在组中。试试这个:

SELECT o.author_id, SUM(o.vote_value) AS vote_value, n.best AS best_sum, 
      (SUM(o.vote_value) + (10 * n.best)) AS total 
      FROM comments o 
      JOIN (
       SELECT SUM(best) AS best, author_id 
       FROM comments 
       GROUP BY author_id 
      ) n ON o.author_id = n.author_id 
      GROUP BY o.author_id 
      ORDER BY total DESC 
      LIMIT 0, 4 

此外,也许我失去了一些东西,但不会这项工作,保存子查询?

SELECT o.author_id, SUM(o.vote_value) AS vote_value, SUM(o.best) AS best_sum, 
      (SUM(o.vote_value) + (10 * SUM(o.best))) AS total 
      FROM comments o 
      GROUP BY o.author_id 
      ORDER BY total DESC 
      LIMIT 0, 4 
+0

Yap ...第二个工作,不需要子查询:) 谢谢,你救了我的一天:))) – Kenan 2010-01-26 11:14:25

0

我假设你想有一个0值,如果最好= NULL尝试COALESCE

count(COALESCE(best,0) AS best) 
+0

我认为这是行不通的,因为best始终是1(WHERE子句需要它)。问题来自于生成NULL的LEFT JOIN,所以如果你想使用COALESCE,你必须按照sergiom的建议来做。 – 2010-01-26 12:15:09

0

您应该使用COALESCE(n.best,0)

COALESCE返回第二个参数时,第一个是NULL

SELECT o.author_id, SUM(o.vote_value) AS vote_value, 
      COALESCE(n.best, 0) AS best_sum, 
      (SUM(o.vote_value) + (10 * COALESCE(n.best, 0))) AS total 
      FROM comments o 
      LEFT JOIN (
       SELECT COUNT(best) AS best, author_id 
       FROM comments 
       WHERE best = 1 
       GROUP BY author_id 
      ) n ON o.author_id = n.author_id 
      GROUP BY o.author_id 
      ORDER BY total DESC 
      LIMIT 0, 4 
+1

我认为你只修复best_sum。总共需要相同的治疗。 – 2010-01-26 10:57:40

+0

@马克你是对的,我相应地修复了代码:) – sergiom 2010-01-26 11:13:08