MySqlには次の4つのテーブルがあります。
ユーザー:
映画:
コレクション(ユーザーと映画の多対多の関係):
レビュー:
つまり、基本的に私が欲しいのは、ユーザーからデータを取得し、レビューと収集を行い、各ユーザーが残したレビューの数や各ユーザーがコレクションに保存した映画の数など、ある種のユーザー統計を表示することです。3つのテーブル間の単純な結合になると思っていましたが、どうやら間違っていたようです。
COUNT()集計関数を使用するのが最善のアイデアだと思ったので、ユーザーレビューとユーザーコレクションに別々のクエリを作成することから始めました。これは問題なく機能し、両方のクエリの結果は正しいです。
SELECT u.userID, username, COUNT(movieID) AS collection_size
FROM collection c INNER JOIN USER u ON u.userID=c.userID
GROUP BY c.userID
userID username collection_size
7 user 2
8 user03 6
そして
SELECT u.userID, username, COUNT(movieID) AS review_count
FROM review r INNER JOIN USER u ON u.userID=r.userID
GROUP BY r.userID
userID username review_count
7 user 1
8 user03 4
10 user05 1
3つのテーブルすべてを結合しようとすると、問題が発生します。私が問題を解決するために来た最も近いものはこれです:
SELECT u.userID, username, COUNT(DISTINCT c.movieID) AS collection_size, COUNT(DISTINCT r.movieID) AS review_count
FROM collection c INNER JOIN USER u ON u.userID=c.userID
INNER JOIN review r ON r.userID=u.userID
GROUP BY u.userID
userID username collection_size review_count
7 user 2 1
8 user03 6 4
結果はほぼ正しいですが、userIDが10のユーザーは、レビューを1つ残しているにもかかわらず、欠落していることがわかります。このクエリは、少なくとも一つのレビューを残しているユーザーのみを拾うように見えると自分のコレクションに少なくとも一つの映画を持っています。ユーザー10のコレクションに映画を追加して、これを確認しました。その後、彼は結果に適切に表示されます。どのように私は、少なくとも一つのレビューを残しているユーザーを表示するようにクエリを変更できますかOR彼らのコレクションに少なくとも一つの映画を持っていますか?
基本的に私は結果がこれになることを望みます:
userID username collection_size review_count
7 user 2 1
8 user03 6 4
10 user05 0 1
このユーザーにはコレクションがないようです(最初のクエリでは返されません)。LEFT JOIN
代わりに、ユーザーテーブルから始めてsを使用できます。
SELECT u.userID, u.username,
COUNT(DISTINCT c.movieID) AS collection_size,
COUNT(DISTINCT r.movieID) AS review_count
FROM usr u
LEFT JOIN collection c ON u.userID=c.userID
LEFT JOIN review r ON r.userID=u.userID
GROUP BY u.userID
これは機能しますが、効率的ではありません。結合は両側の行を乗算し、その後、個別の主キー値をカウントします。クエリは、カウントの2つのサブクエリでより効率的に表現されると思います。
select u.userid, u.username,
(select count(*) from collection c where c.userid = u.userid) as collection_size,
(select count(*) from review r where r.userid = u.userid) as review_count
from usr u
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加