-1

複数のコンテンツ タイプとユーザーを含むデータベースと、いいねを含む別のデータベースがあります。タイプに関係なく、コンテンツのいずれかに対して最も多くの「いいね!」を受け取ったユーザーを把握しようとしています。

特定のコンテンツ タイプ別に最も好きなユーザーを見つけるためのクエリを理解することはできましたが、任意のコンテンツ タイプを使用するのは少し難しいことがわかりました。

このデータベースには何百万ものレコードがあることに注意してください。

クエリを作成するために私が行ってきた作業は次のとおりです...それは正しくないと確信しています!

SELECT picture.user_id, video.creator_id, post.author_id
FROM likes_service.likes
INNER JOIN prod.pictures picture ON likes.obj_id = picture.id
INNER JOIN prod.videos video ON likes.obj_id = video.id
INNER JOIN prod.posts post ON likes.obj_id = post.id
GROUP BY picture.user_id, video.creator_id, post.author_id
ORDER BY COUNT(picture.user_id), COUNT(video.creator_id), COUNT(post.author_id) DESC
LIMIT 20;

誰かが私にヒントを与えたり、正しい方向に向けてくれませんか? 近づいた気がする…

ありがとう!

4

2 に答える 2

2

マルチウェイJOINではなく、UNIONが必要だと思います。

select objects.user_id user_id, sum(likes.like_count) like_count
from (
    select user_id, id
    from prod.pictures
    union all
    select creator_id, id
    from prod.videos
    union all
    select author_id, id
    from prod.posts) objects
join (select obj_id, count(*) likes_count
      from likes_service.likes
      group by obj_id) likes on likes.obj_id = objects.id
group by user_id
order by like_count desc
于 2012-12-14T00:22:09.800 に答える
1

最もいいねがリストされているオブジェクトを持つユーザーが必要なのか、それとも全体的ないいねがすべてのコンテンツに広がっているユーザーを探しているのかは明確ではありません。

いいねが1,000枚ある写真が1枚しかないユーザーを考えてみましょう。そのユーザーは、合計100枚の写真、動画、投稿の平均いいね数が20で、いいねの数が50で最も多いユーザーの前にリストされる必要がありますか?

これらは2つの異なるクエリです。

今のところ、あなたが見つけたいのは「最も好きな」アイテムであると仮定し、次にそれらのオブジェクトのそれぞれがどのユーザーによって作成/作成されたかを見つけます。20個の「最も好きな」アイテムを見つけるには、どの「obj_id」が最も好きかを見つけるのは非常に簡単です。

SELECT l.obj_id
     , COUNT(1) AS like_count
  FROM likes_service.likes l
 GROUP BY l.obj_id
ORDER BY like_count DESC
LIMIT 0,20

(元のクエリに基づいて)スキーマとサンプルデータがない場合、テーブル内のの値は他のテーブルの1つにある単一のオブジェクトの値を参照していると想定していますobj_id...likesつまりidobj_id値はtはとテーブルの両方に表示されphotosますvideosobj_id(それ以外の場合は、参照しているテーブルを示す列が隣のどこかにある可能性がありますobj_id。)

その前のクエリをインラインビューとして使用し(MySQLでは派生テーブルと呼びます)、便利なエイリアス「ml」(最も気に入っています)を指定し、各ターゲットオブジェクトテーブル(写真)に対してLEFTJOINを実行します。 、ビデオ、投稿)、それがどのようなアイテムであるか、そしてユーザー/作成者/作成者が誰であるかを理解するために。

SELECT ml.obj_id
     , ml.like_count
     , p.user_id
     , v.creator_id
     , t.author_id
  FROM ( SELECT l.obj_id
              , COUNT(1) AS like_count
           FROM likes_service.likes l
          GROUP BY l.obj_id
          ORDER BY like_count DESC
          LIMIT 0,20
       ) ml
  LEFT
  JOIN prod.pictures p
    ON p.id = ml.obj_id
  LEFT
  JOIN prod.videos v
    ON v.id = ml.obj_id
  LEFT
  JOIN prod.videos v
    ON v.id = ml.obj_id
  LEFT
  JOIN prod.posts t
    ON t.id = ml.obj_id
 ORDER BY ml.like_count DESC

user_idphotosテーブルの列がNOTNULLであり、creator_id from thevideos`テーブルがNOTNULLであると仮定します...

次に、obj_idが見つかったテーブルを特定できます。つまり、user_id列がnullでない場合は、写真テーブルからのものであり、creator_idnullでない場合は、ビデオテーブルからのものであることがわかります。

その最も外側の選択にいくつかの式を追加して、それを解読することができます...

SELECT CASE WHEN p.user_id    IS NOT NULL THEN 'photo'
            WHEN v.creator_id IS NOT NULL THEN 'video'
            WHEN t.author_ID  IS NOT NULL THEN 'post'
       END AS obj_type
     , CASE WHEN p.user_id    IS NOT NULL THEN p.user_id
            WHEN v.creator_id IS NOT NULL THEN v.creator_id
            WHEN t.author_id  IS NOT NULL THEN t.author_id
       END AS user_id
     , l.obj_id
于 2012-12-14T00:46:49.340 に答える