最もいいねがリストされているオブジェクトを持つユーザーが必要なのか、それとも全体的ないいねがすべてのコンテンツに広がっているユーザーを探しているのかは明確ではありません。
いいねが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
つまりid
、obj_id
値はtはとテーブルの両方に表示されphotos
ますvideos
。obj_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_id
photosテーブルの列がNOTNULLであり、creator_id from the
videos`テーブルがNOTNULLであると仮定します...
次に、obj_idが見つかったテーブルを特定できます。つまり、user_id
列がnullでない場合は、写真テーブルからのものであり、creator_id
nullでない場合は、ビデオテーブルからのものであることがわかります。
その最も外側の選択にいくつかの式を追加して、それを解読することができます...
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