2

我在进行查询时遇到问题,该查询的行为必须如下:

想象一个"Users"用这些列名命名的表:id, name, vote.

vote列包含行的 id。例如,如果我是 id = 0,而你是 id = 1,我希望为你投票,因此我的vote条目为“1”,您希望为自己投票,因此您的条目也为“1”。

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

所以它应该计算所有有你的 id 的选票,并将该数字放在总选票下。

我的"totalVotes"应该是“0”,你的应该是“2”。

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

任何提示将不胜感激,如果难以理解,请随时告诉我应该更好地表达哪一部分。

4

2 回答 2

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

一点解释:

  • 我正在使用子查询,对来自Usersby 的记录进行分组vote,所以我将有一个表,其中我有每个用户的票数
  • 之后加入Users这张桌子
  • 在我ifnull用来为没有投票的用户显示 0 的最终记录集中。

This, I believe, the fastest way to do this query in MySQL (without window functions), here you can see sql fiddle for only 1280 rows with my query and Carter's one using subquery.

sql fiddle demo

Results:

  • My query: 4ms
  • Carter's query with subquery: 832ms
于 2013-09-21T17:43:18.573 回答
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例如。

附录:正如 Roman 所指出的,在效率方面,他的答案显然是我们两个中更好的。一般来说,连接比子查询更有效。

于 2013-09-21T17:40:05.397 回答