0

私の最後の質問に対する優れた答えを得ました:SQLの効率の改善(@Bohemianに感謝)私は、複雑さが増しているので、少し近視眼的であることに気づきました。

同じテーブルLIKES(likeID、userID、objectID、likeDate)を使用すると、誰かがオブジェクトを気に入った後、好きになるたびに1ポイントを獲得するという考え方があります。

前の質問の助けを借りて、ユーザーが好きになった後のいいねの数を取得できますが、今度はこの問題にオブジェクトがあることを考慮する必要があります。

好きなオブジェクトごとに、自分の後に作られた好きなものを数えることで、ユーザーが獲得できるポイント数を計算できるようにしたいと思います(これは厄介な文でした)。

SQLのさらなる「ネスト」を検討していますが、これは私のリーグ外であるため、最後の質問にあるもの以外のコードを実際に提供することはできません。

4

1 に答える 1

0

これは、相関サブクエリを使用して実行できます。

select l.userid, l.objectid, l.LikeDate,
       (select count(*) from likes l2 where l2.objectid = l.objectid and l2.LikeDate >= l.likeDate and l2.userid <> l.userid
       ) as NumLikesAfterward
from likes l

これが行っているのは、特定のいいねの後、他のユーザーによるオブジェクトのいいねの数を数えることです。の行ごとに1行を返しますlikesselect計算は、句内の相関サブクエリを使用して行われます。

にインデックスがあると仮定すると、はるかに高速に実行されlikes(objectid, likedate, userid)ます。

ユーザーの合計ポイントを取得するには:

select sum(NumLikesAfterward) as TotalPoints
from (select l.userid, l.objectid, l.LikeDate,
             (select count(*) from likes l2 where l2.objectid = l.objectid and l2.LikeDate >= l.likeDate and l2.userid <> l.userid
             ) as NumLikesAfterward
      from likes l
      where userid = $userid
     ) uol
于 2013-02-07T14:12:18.560 に答える