这里有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
它工作正常,但问题是缺少没有任何选票的汽车。
此查询命令:
预期结果是:
我用 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
答案 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 |