SQL查询:必须遍历表,COUNT个特定条目,并在查询的其余部分中将该结果用作列名

时间:2013-09-21 17:19:12

标签: mysql sql

我无法进行必须遵循以下操作的查询:

想象一下名为"Users"的表格,其中包含以下列名称:id, name, vote

vote列包含行的ID。例如,如果我是id = 0,并且你是id = 1,我希望为你投票,所以我的vote条目保持为“1”,你希望自己投票,所以你的也是“1”。

我想要一个返回这些列的查询:id, name, vote, totalVotes

所以它应该计算所有拥有你身份的投票并将该数字置于总票数之下。

我的"totalVotes"将为“0”,而您的{{1}}将为“2”。

问题是我不明白如何浏览整个表格,计算用户的总投票数,然后为每个用户重复。

任何提示都会非常感激,如果难以理解,请随时告诉我哪些部分应该更好。

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

结果:

  • 我的查询: 4ms
  • Carter对子查询的查询: 832ms

答案 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 以获取例外情况。

附录:罗马指出,在效率方面,他的回答显然比我们的两个更好。通常,连接比子查询更有效。