質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

8991閲覧

3つのテーブルとの外部結合とcount()の期待値があいません

casanovaY

総合スコア154

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/04/09 17:19

こんにちは、いつもお世話になっております。

3つのテーブルを外部結合して、group byしたカラム(今回の場合,userId)ごとのcount件数が合わなくて困っています。
現状今のテーブル構成は以下の通りとなっています。
カラム[id]はどのテーブルもauto incrementされたものとなっています。

◆アカウントTBL
|id|userId|userName|
|01|000001|testuser1|
|02|000002|testUser2|
|03|000003|testUser3|
|04|000004|testUser4|

◆投稿TBL
|id|toukouId|userId|toukouText|
|01|01010101|000001|aaaaaa|
|02|03030303|000003|bbbbbb|
|03|01010102|000001|cccccc|
|04|02020202|000002|dddddd|

◆投稿画像TBL(1つの投稿につき複数枚の画像が投稿可能です。また、画像なしの投稿もありえます)
|id|toukouId|userId|imgFile|
|01|01010101|000001|img1|
|02|01010101|000001|img2|
|03|01010102|000001|img3|
|04|02020202|000002|img4|

SELECT文の期待する結果としては以下のようになっています。
◆期待結果
|userId|userName|count(投稿数)|count(画像数)|
|000001|testuser1|2|3|
|000002|testUser2|1|1|
|000003|testUser3|1|0|
|000004|testUser4|0|0|

ただ、3つ以上のテーブルを外部結合して同時に取得したいのですがcount(投稿数、画像数)の値が異常に大きな数値が返ってきます。

テーブル2つの外部結合では正確な値が取得できるのですが、3つめを外部結合した瞬間にダメになります。
参考として試したSQL文を以下に記載します。

◆2つのテーブルだけを外部結合した際のSQL(正確な値が表示されるパターン)

lang

1SELECT U.userId, U.userName, COUNT(T.toukouId) as tCount 2 FROM アカウントTBL U LEFT JOIN 投稿TBL T ON U.userId = T.toukouId group by U.userId

◆3つのテーブルを外部結合した際のSQL(異常な値が返されるパターン)

lang

1SELECT U.userId, U.userName, COUNT(T.toukouId) as tCount COUNT(I.toukouId) as iCount 2 FROM アカウントTBL U LEFT JOIN 投稿TBL T ON U.userId = T.userId 3 LEFT JOIN 投稿画像TBL I ON U.userId = I.userId group by U.userId

基本的に、3つ目の同じように外部結合すればいいだけだと思っていたのですが・・・
調べてからかなりの時間がかかっているので、ご教授お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

FROM アカウントTBL U LEFT JOIN 投稿TBL T ON U.userId = T.userId

|id|userId|userName|id|toukouId|userId|toukouText| |01|000001|testuser1|01|01010101|000001|aaaaaa| |01|000001|testuser1|03|01010102|000001|cccccc| |02|000002|testUser2|04|02020202|000002|dddddd| |03|000003|testUser3|02|03030303|000003|bbbbbb| |04|000004|testUser4|null|null|null|null|

LEFT JOIN 投稿画像TBL I ON U.userId = I.userId

|id|userId|userName|id|toukouId|userId|toukouText|id|toukouId|userId|imgFile| |01|000001|testuser1|01|01010101|000001|aaaaaa|01|01010101|000001|img1| |01|000001|testuser1|01|01010101|000001|aaaaaa|02|01010101|000001|img2| |01|000001|testuser1|01|01010101|000001|aaaaaa|03|01010102|000001|img3| |01|000001|testuser1|03|01010102|000001|cccccc|01|01010101|000001|img1| |01|000001|testuser1|03|01010102|000001|cccccc|02|01010101|000001|img2| |01|000001|testuser1|03|01010102|000001|cccccc|03|01010102|000001|img3| |02|000002|testUser2|04|02020202|000002|dddddd|04|02020202|000002|img4| |03|000003|testUser3|02|03030303|000003|bbbbbb|null|null|null|null| |04|000004|testUser4|null|null|null|null|null|null|null|null|

SELECT U.userId, U.userName, COUNT(T.toukouId) as tCount, COUNT(I.toukouId) as iCount
group by U.userId

|userId|userName|count(投稿数)|count(画像数)| |000001|testuser1|6|6| |000002|testuser2|1|1| |000003|testUser3|1|0| |000004|testUser4|0|0|

と、なるわけです。

SELECT A.userId, A.userName, A.tCount, B.iCount FROM ( SELECT U.user_id, U.user_name, COUNT(T.toukou_id) as tCount FROM アカウントTBL U LEFT JOIN 投稿TBL T USING(userId) GROUP BY U.user_id ) as A LEFT JOIN ( SELECT U.userId, COUNT(I.toukouId) as iCount FROM アカウントTBL U LEFT JOIN 投稿画像TBL I USING(userId) GROUP BY U.user_id ) AS B USING(userId)

汚いSQLですみませんが、こんな感じで期待値です。

投稿2015/04/09 22:45

編集2015/04/09 23:17
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

casanovaY

2015/04/10 03:30

すごい分かりやすい説明、誠にありがとうございます! また、こんなに早くご回答いただけるなんて!ありがとうございます。 ご教授いただいたSQLを自分のプログラム用に修正したところ期待通りの結果が得られました!
guest

0

操作を間違えました。。。

投稿2015/04/10 04:24

編集2015/04/10 04:26
kutsulog

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

結合条件が足りていないので
投稿TBLの件数×投稿画像TBLの件数になっているように思えます```lang-<SQL>
SELECT
U.userId
, U.userName
, COUNT(DISTINCT T.toukouId) as tCount
, COUNT(I.toukouId) as iCount
FROM アカウントTBL U
LEFT JOIN 投稿TBL T
ON U.userId = T.userId
LEFT JOIN 投稿画像TBL I
ON T.toukouId = I.toukouId -- <- この条件が足りてない
AND U.userId = I.userId -- <- たした条件で絞り込めているのでなくてよい
group by
U.userId
, U.userName

こんなSQLでいかがでしょうか?

投稿2015/04/10 02:11

編集2015/04/10 02:17
kutsulog

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kutsulog

2015/04/10 04:31

せっかく各テーブルにuserIdがあるのでこっちのほうがシンプルかもしれません ```lang-<SQL> SELECT U.userId , U.userName , T.tCount , I.iCount FROM アカウントTBL U LEFT JOIN ( SELECT userId , count(*) as tCount FROM 投稿TBL GROUP BY userId ) as T ON U.userId = T.userId LEFT JOIN ( SELECT userId , count(*) as iCount FROM 投稿画像TBL GROUP BY userId ) as I ON U.userId = I.userId ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問