いつもお世話になっております。
前回(多分1年ほど前)
質問させて頂いた際は丁寧に回答頂きまして感謝しております。
自分であれこれと思いめぐらせてみたのですが、これだと思うSQL文が思いつきませんでして、早速ですが質問をさせて頂きたいと思います。
テーブル構造
user_id ques_id result (プライマリーは別途)
001 1 1
002 1 0
003 1 1
004 1 1
002 2 1
003 2 0
001 3 1
…
学習のデータベースの初答の場合の結果を記録するものです。
user_idとques_idでユニークです。
例えば、1レコード目はユーザ001が
問題番号1を正解(result=1)したことを表します。
※任意問題に対してすべてのユーザが
問題を解いているとは限りません。
ここで、取り出したい情報は
ある任意の問題セット(例: (1,3,4,5))を全て解いているユーザ
のuser_idとその問題セットの正答率です。
理想的な結果としては
ある問題セットに対して
user_id 正答率
001 3/4
のように出力されて欲しいです。
*私が考えたこと
(SELECT * from テーブル WHERE ques_id = 1) as t1 LEFT JOIN (SELECT * from テーブル WHERE ques_id = 3) as t2
USING(user_id)
って繋げてみて・・・どうするんだろう(???)
これでもなんかいびつな感じがとってもします。
って感じです。
アドバイス頂ければ幸いです。
No.4
- 回答日時:
chukenkenkou さんの回答への補足。
sum(result)/count(result) は AVG(result) で書けます。
count(*)以外の集約関数は、NULLを最初から取り除きます。
No.3
- 回答日時:
ありゃりゃ。
。。ちょっとテストした結果のSQLをそのまま提示してしまいましたが、今回の提示要件の通りなら、クエリのネストは不要でしたね。
ただ、クエリをネストすることで、内側のクエリで付けた別名を、その側のクエリで利用したり、すべての列の値を表示したりできるので、クエリをネストすることに、まったく意味がない訳ではありません。
「提示されたデータが中途半端」と書いたのは、「表の他の列の値」という意味ではなくて、得たい結果としてuser_id='001'のデータが4件必要なのに、提示されたデータでは2件しかないという意味です。
こういったサイトで質問する場合は、実際に使っている表定義、データ、得たい結果などで、簡略化するのは仕方ないことです。しかし、簡略化した中では、整合性がある内容にしないと、他人がアドバイスする上で、いろいろ誤解釈が生じることが多いです。
さて、本題に戻りますが、例えば、「問題は解いたけれど、合否判定が未実施」といったケースがあり得るなら、「count(*)」でなく、「count(result)」とすることで、nullで入っているデータを除外できます。
そういうケースがないなら、「count(*)」で問題ありません。
select
user_id,
sum(result) as 正答数,
count(result) as 有効回答数,
count(*) as 総解答数,
sum(result)/count(result) as 有効正答率
from t1
where ques_id in(1,3,4,5)
group by user_id
having count(*)=4
;
ご回答頂きありがとうございます。
何故かちょっとわからないのですが1回目に提示いただいたクエリでやってみますとMysqlが止まってしまいました。
何か別の原因なのかもしれません。
データの数が多いからなのか・・・
アドバイスいただいた件了解しました、
今後、質問させていただく場合はデータの整合性を
とったものを例とするよう気をつけていこうと思います。
今後ごともよろしくお願いいたします。
No.1
- 回答日時:
MySQLの質問をする場合は、バージョンを明記してください。
バージョンにより、SQL周りだけでも大きく機能が違います。
例えば、こんな感じです。
MySQL 4.0以前・・・一部のjoin、union、一時表などは実装済
MySQL 4.1・・・joinの実装範囲の拡張、サブクエリ、unicodeなどの実装
MySQL 5.0・・・ビュー、ストアドプロシジャ、トリガなどの実装
データ例、得たい結果、自分で考えたSQLが提示されている点は好感を持てますが、データ例が中途半端で、回答者側で「得たい結果から、不足分のデータを推測する」ことになってしまいます。
要件が不明な点がいくつかありますが、取りあえずSQLを提示しておきます。
要件に合わせて、変更してみてください。
<SQL例>
select
-- *
user_id,
sum(result) as 正答数,
count(*) as 解答数,
sum(result)/count(*) as 正答率
from t1
where user_id in(
select
user_id
from t1
where ques_id in(1,3,4,5)
group by user_id
having count(*)=4
)
group by user_id
;
この回答への補足
バージョンは5.0です。
不足して申し訳ございません。
例文を理解させて頂いてまたお礼のほう書かせて頂きたいと思います。
早急な返答を頂きありがとうございました。
ご回答頂いたSQLを理解できた気がします。
inとサブクエリの使い方など大変参考になりました
ありがとうございます。
ある問題セットこの場合は(1,3,4,5)をすべて解いたことのあるユーザの全問題に対する、正答率を求めることになると思います。
user_id ques_id result pkey
001 1 1 1
002 1 0 2
003 1 1 3
004 1 1 4
002 2 1 5
003 2 0 6
001 3 1 7
私の意図としましては、ある問題セット(1,3,4,5)における、それらすべてを解いたことのあるユーザの正答率を出したいという意図でした。
まずは、ご教授いただいた例を参考に自力で考えてみようと思います。
この度はご返答下さり、有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Oracle SQL update方法 2 2022/06/22 14:07
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
VIEWの元のテーブルのindexって...
-
insertを高速化させたい
-
SQL Left Join で重複を排除す...
-
select文のwhere句に配列を入れ...
-
一つ前のレコードの値と減算し...
-
SQLサーバから、項目の属性(型...
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
-
期間の重複を調べるSQL文につい...
-
テーブル名を省略して「h.id」...
-
SELECT~LIKE~の結果が変
-
[MySQL] UNIQUE制約の値を更新...
-
1テーブル&複数レコードの更新...
-
マイクラPC版のコマンドで効率...
-
URL と行番号の指定
-
副問合せの書き方について
-
上位3位を求めるSQL文は?
-
SQLにて特定の文字を除いた検索...
-
mysqlのload data infileで連番...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
VIEWの元のテーブルのindexって...
-
SQLサーバから、項目の属性(型...
-
select文のwhere句に配列を入れ...
-
副問合せの書き方について
-
マイクラPC版のコマンドで効率...
-
Unionした最後にGROUP BYを追加...
-
selectした大量データをinsert...
-
SQLにて特定の文字を除いた検索...
-
[SQLServer] テーブル名からカ...
-
1テーブル&複数レコードの更新...
-
inner joinをすると数がおかし...
-
クエリ表示と、ADOで抽出したレ...
-
ある条件の最大値+1を初番する...
-
sqlで、600行あるテーブルを100...
-
複数テーブルのGROUP BY の使い...
-
insertを高速化させたい
-
PL/SQLの変数について
-
キー毎の、ある列のmaxのレコー...
おすすめ情報