COUNT()を使用して3つの結合されたテーブルからデータを取得する

ミハイロ・ジョルジェビッチ

MySqlには次の4つのテーブルがあります。

ユーザー

  • ユーザーID
  • ユーザー名
  • パスワード
  • 他のいくつかのもの

映画

  • movieID
  • 名前
  • 他のいくつかのもの

コレクション(ユーザーと映画の多対多の関係):

  • ユーザーID
  • movieID

レビュー

  • reviewID
  • ユーザーID
  • movieID
  • 他のいくつかのもの

つまり、基本的に私が欲しいのは、ユーザーからデータを取得し、レビューと収集を行い、各ユーザーが残したレビューの数や各ユーザーがコレクションに保存した映画の数など、ある種のユーザー統計を表示することです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
GMB

このユーザーにはコレクションがないようです(最初のクエリでは返されません)。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]

編集
0

コメントを追加

0

関連記事

結合を使用してSQLServerの3つ以上のテーブルからデータを取得する方法

MySQL-これらの3つのテーブルを結合してデータを取得する方法は?

データベースから2つのテーブルを選択し、1つのテーブルに結合された結果を取得します

Hibernate:CtriteriaAPIを使用して2つのリンクされたテーブルからデータを取得する

3つのテーブルから結合されたデータを選択します

内部選択を使用して3つのテーブルからのデータを結合する

SQLステートメントを使用して3つのテーブルを結合し、各テーブルからデータを取得します

結合を使用してテーブルからデータを取得する方法

結合を使用してテーブルからデータを取得する

phpとCount関数を使用して3つのデータテーブルを結合する方法も

Simple OData Clientで結合を使用して2つのテーブルからデータを取得するにはどうすればよいですか?

「結合」を使用して2つのテーブルからデータを取得するにはどうすればよいですか?

3つの異なるデータテーブルで構成されるデータテーブルで内部結合を使用し、c#を使用して統合データテーブルとして結果を返したい

結合を使用して2つのテーブルからデータを取得し、CountとGroupByを実行します

親キーを使用して結合テーブルからすべてのデータを取得する方法

内部結合、エイリアスを使用して2つのテーブルからデータを取得するためのMySQLクエリ

mysqlのgroup句を使用して結合されたテーブルでcountを使用して結合する

3つの結合されたテーブルからC#のリストのリストとして値を取得するtsql

2つのテーブルを結合して結合された結果を取得する方法

MVCで2つの結合されたテーブルからのデータを表示します

2つの異なるデータベースから2つのテーブルを結合し、C#/ ASPを使用してMSSQLからデータを取得する方法。そのための接続文字列を管理する方法は?

結合とgroupbyを使用して3つのテーブルから値を取得する

結合とgroupbyを使用して3つのテーブルから値を取得する

左結合を使用してマスターテーブルからすべてのデータを取得するにはどうすればよいですか?

左外部結合とon句を使用して、共通の列を持つ2つの異なるテーブルからデータを取得する

SpringとHibernateを使用して複数のテーブル結合からデータを取得する

SpringとHibernateを使用して複数のテーブル結合からデータを取得する

左外部結合を使用して複数のテーブルからデータを取得する-PDO

JPAを介して結合された2番目のテーブルから特定の行を取得する方法

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    CSSのみを使用して三角形のアニメーションを作成する方法

  3. 3

    ZScalerと証明書の問題により、Dockerを使用できません

  4. 4

    ドロップダウンリストで選択したアイテムのQComboBoxスタイル

  5. 5

    別のホストからTomcat Managerアプリにアクセスする

  6. 6

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  7. 7

    Windows 10でのUSB入力デバイスの挿入/取り外しの検出

  8. 8

    Python / SciPyのピーク検出アルゴリズム

  9. 9

    MLでのデータ前処理の背後にある直感

  10. 10

    useRefに反応してコンポーネントをスクロールして表示する

  11. 11

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  12. 12

    パンダは異なる名前の列に追加します

  13. 13

    PictureBoxで画像のブレンドを無効にする

  14. 14

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  15. 15

    Pythonを使用して、リストからデータを読み取り、特定の値をElasticsearchにインデックス付けするにはどうすればよいですか?

  16. 16

    LinuxでPySide2(Qt for Python)をインストールするQt Designerはどこにありますか?

  17. 17

    Material-UIでTextFieldエラーの色を条件付きでオーバーライドする方法

  18. 18

    goormIDEは、ターミナルがロードするデフォルトプロジェクトを変更します

  19. 19

    MatplotlibまたはSeabornを使用して、グループ化されたデータから複数のプロットを生成するにはどうすればよいですか?

  20. 20

    Luaの文字列から特定の特殊文字を削除するにはどうすればよいですか?

  21. 21

    Flutterにファイルピッカープラグインを追加するにはどうすればよいですか?

ホットタグ

アーカイブ