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

少し説明:

  • からレコードをグループ化するサブクエリを使用しているUsersのでvote、各ユーザーの投票数を示すテーブルがあります
  • その後、Usersこのテーブルに参加します
  • 私が使用ifnullしている最終的なレコードセットでは、投票のないユーザーには 0 を表示しています。

これは、MySQL でこのクエリを (ウィンドウ関数なしで) 実行する最速の方法だと思います。

sql fiddle demo

結果:

  • 私のクエリ: 4ms
  • サブクエリを使用したカーターのクエリ: 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例については。

補遺:ローマンが指摘しているように、効率に関して言えば、彼の答えは明らかに私たちの 2 つよりも優れています。一般に、結合はサブクエリよりも効率的です。

于 2013-09-21T17:40:05.397 に答える