mysql过滤结果是另一个表的字段的总和,包括空行

时间:2014-12-17 21:25:28

标签: mysql

这里有3张桌子:

标题

id | title

1 | Cars
2 | Computers

输入

id | entry    | title_id
1  | bmw      |   1       
2  | mercedes |   1       
3  | ibm      |   2       
4  | hp       |   2       
5  | dell     |   2       
6  | acer     |   2        
7  | asus     |   2       
8  | toshiba  |   2      
9  | ferrari  |   1      
10 | toyota   |   1      
11 | honda    |   1       

entry_votes

id | entry_id | vote
1  | 1        |  1       
2  | 1        |  1     
3  | 1        | -1     
4  | 2        |  1     
5  | 2        | -1     
6  | 9        |  1    
7  | 9        |  1     
8  | 9        |  1    
9  | 10       | -1    
10 | 10       | -1    

我需要按照他们得到的票数来订购参赛作品。

我使用此代码通过投票订购汽车。

SET @title_id = 2;
select e.id, sum(v.vote) as score
from entry e join entry_votes v on (e.id = v.entry_id) and e.title_id=@title_id
group by e.id order by score desc

它工作正常,但问题是缺少没有任何选票的汽车。

此查询命令:

  • 法拉利(+3)
  • 宝马(1)
  • 梅赛德斯(0)
  • 丰田(-2)

预期结果是:

  • 法拉利(+3)
  • 宝马(1)
  • 梅赛德斯(0)
  • 本田(0)
  • 丰田(-2)

我用 COALESCE

得到了结果

正确的查询是:

SET @title_id = 2;
    select e.*, COALESCE(sum(v.vote),0) as score
    from entry e left join entry_votes v on (e.id = v.entry_id) where e.title_id=@title_id
    group by e.id order by score desc

2 个答案:

答案 0 :(得分:0)

您可以尝试使用LEFT JOIN,但我认为您的表/查询中可能存在拼写错误或错误:

在您的条目表中,梅赛德斯有一个标题= 2(计算机)而不是1(汽车)。

你有' @title_id = 2'。

  SET @title_id = 1; 
      select e.id, COALESCE(sum(v.vote),0) as score 
      from entry e left join entry_votes v 
      on (e.id = v.entry_id) WHERE e.title_id=@title_id
      group by e.id order by score desc

编辑:

编辑查询以添加COALESCE,以便正确排序。这个函数的作用是,如果你得到一个NULL值,它将返回(在这种情况下)一个0。

答案 1 :(得分:0)

你不需要在你的 sql 中声明一个变量。只需将 titles 表加入 entry 表。

SQL:(Demo)

SELECT e.entry, SUM(COALESCE(v.vote, 0)) AS score
FROM entry e
JOIN titles t ON e.title_id=t.id
LEFT JOIN entry_votes v ON e.id=v.entry_id
WHERE t.title = 'Cars'
GROUP BY e.entry
ORDER BY score DESC

左连接将允许没有投票的行出现在结果集中。对于一致的数字投票计数,合并空值总和为 0。为清晰起见,在编写 SQL 关键字/函数时使用全部大写。

结果集:

<头>
条目 得分
法拉利 3
宝马 1
本田 0
梅赛德斯 0
丰田 -2