我无法进行必须遵循以下操作的查询:
想象一下名为"Users"
的表格,其中包含以下列名称:id, name, vote
。
vote
列包含行的ID。例如,如果我是id = 0,并且你是id = 1,我希望为你投票,所以我的vote
条目保持为“1”,你希望自己投票,所以你的也是“1”。
我想要一个返回这些列的查询:id, name, vote, totalVotes
。
所以它应该计算所有拥有你身份的投票并将该数字置于总票数之下。
我的"totalVotes"
将为“0”,而您的{{1}}将为“2”。
问题是我不明白如何浏览整个表格,计算用户的总投票数,然后为每个用户重复。
任何提示都会非常感激,如果难以理解,请随时告诉我哪些部分应该更好。
答案 0 :(得分:3)
select
u1.id, u1.name, u1.vote,
ifnull(u2.totalVotes, 0) as totalVotes
from Users as u1
left outer join (
select u2.vote as id, count(*) as totalVotes
from Users as u2
group by u2.vote
) as u2 on u2.id = u1.id
<强> sql fiddle demo 强>
一点解释:
Users
中的记录按vote
分组,因此我将有一个表格,其中我有每个用户的投票数Users
与此表ifnull
为没有投票的用户显示0。我相信这是在MySQL中进行此查询的最快方法(没有窗口函数),在这里你可以看到sql小提琴只有1280行我的查询和Carter的一个使用子查询。
<强> sql fiddle demo 强>
结果:
答案 1 :(得分:0)
这将是一种方式......
select
u1.id,
u1.name,
u1.vote,
(select count(*) from Users as u2 where u2.vote = u1.id) as totalVotes
from
Users as u1;
请参阅: this SQL Fiddle 以获取例外情况。
附录:罗马指出,在效率方面,他的回答显然比我们的两个更好。通常,连接比子查询更有效。