
お世話になっています。
複数テーブルの集計がわからないので質問させてください。
テーブル3のItem1~4にはテーブル2のItemIDを登録します。
エリア毎の参加人数をcsvデータを出力させたいです。
テーブル3においてテーブル2のItemIDが4つあるので、一人に対して4行必要なのかと思いましたが、テーブルの変更ができません。
テーブルの結合まではできましたがその後ができません。
テーブルの変更ができませんので、結合するためにテーブル2の構造とデータが同じテーブルを他に3つ作成しています。
どうぞよろしくお願いします。
テーブル1
AreaID AreaName
---------------------
1 北海道
2 東北
3 関東
4 北陸
テーブル2
ItemID ItemName
---------------------
1 自由形50
2 自由形100
3 背泳ぎ50
4 平泳ぎ50
テーブル3
ID AreaID Name Item1 Item2 Item3 Item4
---------------------------------------------------------
1 2 鈴木 2 1 4 3
2 3 佐藤 1 null 3 null
3 1 田中 1 2 null null
4 2 伊藤 3 null 2 4
5 3 川村 null 2 3 null
「集計結果」
参加人数 自由形50 自由形100 背泳ぎ50 平泳ぎ50
---------------------------------------------------------------
北海道 1 1 1 0 0
東北 2 1 2 2 2
関東 2 1 1 2 0
北陸 0 0 0 0 0
No.1ベストアンサー
- 回答日時:
MySQLの質問をする場合は、バージョンを明記しましょう。
せっかく具体的なSQLを提示しても、質問者さんの環境では実行できない可能性があります。>テーブルの変更ができません
どう頑張っても性能を出せなかったり、今後の機能拡張などが困難になったりしますよ?
下記SQLは、MySQL 4.1以降なら動くと思います。
テーブル2は、未使用です。
【SQL例】
select
AreaName,
count(distinct ID) 参加人数,
count(case when Item=1 then 1 else null end) as 自由形50,
count(case when Item=2 then 1 else null end) as 自由形100,
count(case when Item=3 then 1 else null end) as 背泳ぎ50,
count(case when Item=4 then 1 else null end) as 平泳ぎ50
from t1 as x
left join
(
select ID,AreaID,1 as Item from t3 where Item1=1 or Item2=1 or Item3=1 or Item4=1
union all
select ID,AreaID,2 as Item from t3 where Item1=2 or Item2=2 or Item3=2 or Item4=2
union all
select ID,AreaID,3 as Item from t3 where Item1=3 or Item2=3 or Item3=3 or Item4=3
union all
select ID,AreaID,4 as Item from t3 where Item1=4 or Item2=4 or Item3=4 or Item4=4
) as y
on x.AreaID=y.AreaID
group by AreaName
order by x.AreaID
;
この回答への補足
すみません。もうひとつだけ教えていただきたいことがあります。
PHPで開発しており、教えていただいたSQLを
$sql="select
AreaName,
count(distinct ID) 参加人数,
count(case when Item=1 then 1 else null end) as 自由形50,
count(case when Item=2 then 1 else null end) as 自由形100,
count(case when Item=3 then 1 else null end) as 背泳ぎ50,
count(case when Item=4 then 1 else null end) as 平泳ぎ50
from t1 as x
left join
(
select ID,AreaID,1 as Item from t3 where Item1=1 or Item2=1 or Item3=1 or Item4=1
union all
select ID,AreaID,2 as Item from t3 where Item1=2 or Item2=2 or Item3=2 or Item4=2
union all
select ID,AreaID,3 as Item from t3 where Item1=3 or Item2=3 or Item3=3 or Item4=3
union all
select ID,AreaID,4 as Item from t3 where Item1=4 or Item2=4 or Item3=4 or Item4=4
) as y
on x.AreaID=y.AreaID
group by AreaName
order by x.AreaID";
としました。
しかし、PHPMyAdmin上からSQL文は問題なく通り期待した結果が得られましたが、
PHPからは
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource というエラーがでます。
mysql_error()で確認したところ以下のようなエラーがでました。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '参加人数, count(case when Item=1 then 1 else null end) as 自由形
参加人数を「''」で囲むなどしてみましたが見当違いでした…
お手数かけて申し訳ないのですが、ご教授ください。
ご回答ありがとうございました。
教えていただいたSQLで実現できました!
テーブル2は使うものとばかり考えていました…
バージョンはMySQL4.1.18です。提示せずすみません。。
テーブルの変更は改めてお願いしてみます。
本当にありがとうございました。
No.4
- 回答日時:
#1回答者です。
確かに「as」を忘れていましたね。
ただ、「式 as 別名」の「as」は、多くのRDBMSで省略可能であり、MySQLでも同様に省略可能です。
→マニュアルのselect構文のところにも、明記されています。
ところで、「回答への補足」と「回答へのお礼」は、どちらが最新のステータスなのかが分からない(ここのシステムの仕組みが分かっていない)のですが、まだ、PHPでは実行できていないのでしょうか?
ご回答ありがとうございました。
MyAdminから試して問題がなかったのでお礼を投稿させていただき、
PHPからエラーがでたので補足を追加させていただきました(^^;
しかし、先ほどエラーが解決致しました!
参加人数などの列名を英語にしたところ大丈夫でした。
日本語がエラーになったのは、余計な文字などがあったかもしれないです。この原因は調べている最中です。
おかげさまで実現できました!本当にありがとうございました。

No.2
- 回答日時:
まず、table1とtable3から集計出来るとして、項目名は直書きするしかないかな
MySQL4.0.1では以下のように
select table1.AreaName as area,count(table3.ID) as '参加人数',
count(table3.Item1) as '自由形50',count(table3.Item2) as '自由形100',
count(table3.Item3) as '背泳ぎ50', count(table3.Item4) as '平泳ぎ50'
from table1 left join table3 on table1.AreaID = table3.AreaID
group by table1.AreaName;
または、phpとか他のプログラム言語との連携で項目名変換表示することになるのでは?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- MySQL mysqlの結合について教えてください 1 2022/05/19 15:13
- MySQL MySQLのテーブル作成で 自信がありません。 2 2022/08/28 05:35
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- MySQL 【MySQL】本当に困っているので、助けてください。よろしくお願いします。 3 2023/06/03 14:24
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mysqlがインストールされている...
-
SQLでカラムを追加し、条件に合...
-
エラー 1068 (42000): 複数の主...
-
テーブル名が可変の場合のクエ...
-
SQLです。こんな感じですか?あ...
-
SQLで日付別のIDを生成するには
-
うまくいきません教えてくださ...
-
#1062 - '0' は索引 'PRIMARY' ...
-
テーブルのカラム構造だけをコ...
-
MAMP 99ドル約1.6万円 高い...
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
-
utf8bomとutf8mb4の違いがいま...
-
mysqlで INSERT と SELECTの用途は
-
【初歩】ラジオボタンをつかっ...
-
MySQL NULLだけをカウントして...
-
同一日に複数レコードがある場...
-
あってますか?SQL
-
WHERE `年月日` = '晴' OR `年...
-
SQLを作ったのですがうまくいき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VIEWに対してWHERE句をつける
-
空白文字を含む文字列データの検索
-
JOIN使ってないのに、JOIN操作...
-
コマンドプロンプト 複数の実...
-
MySQL + PHP での自動採番
-
count()の結果を別の計算で使う...
-
レコード全加算
-
基本情報
-
SQLのエイリアス
-
複数のカラムを対象にしたプラ...
-
Mysql 同一テーブルの複数「別...
-
Mysqlで「"A"以外を選択」でき...
-
複数テーブルの集計
-
Null値が入れられない
-
nullと同じく空白をCountしない...
-
NULLを含む列の足し算
-
SQLでLIMIT句を入れるとエラー...
-
MySQLの特定のカラムの内容を全...
-
SELECT文の二段重ね
-
SQL文を入力したらエラー
おすすめ情報