SQLでのVIEW作成方法とは?

このQ&Aのポイント
  • mysqlでviewを作ろうと考えています。テーブルから科目名を一回で取得できるようなViewを作りたいのですが、正しい文法でVIEWを作成する方法を教えてください。
  • sikenテーブルとkamokuテーブルからVIEWを作りたいです。VIEW名はsiken_kamokuとします。sikenテーブルからsiken_idとsiken_name、kamokuテーブルから対応する科目名を取得するVIEWを作成するにはどのようなSQL文を書けば良いですか?
  • sikenテーブルのsiken_idとsiken_name、kamokuテーブルのkamoku_name1、kamoku_name2、kamoku_name3を取得するVIEWを作成したいです。どのようなSQL文を記述すれば良いでしょうか?
回答を見る
  • ベストアンサー

sqlのVIEWの作り方

mysqlでviewを作ろうと考えています。 書籍を調べて3日くらい格闘していましたが挫折してしまい アドバイスをいただきたく、質問いたします。 テーブル名: kamoku kamoku_id name ------------------ 001 国語 002 算数 003 理科 004 社会 テーブル名: siken siken_id siken_name kamoku_id1 kamoku_id2 kamoku_id3 ------------------------------------------------------- 000011 試験1回目 001 002 003 000012 試験2回目  001 003 004 000013 試験3回目 001 002 004 000014 卒業試験 003 004 null この2つのテーブルからVIEWを作りたいと考えています VIEW名 siken_kamoku siken_id siken_name kamoku_id1 kamoku_id2 kamoku_id3 ------------------------------------------------------- 000011 試験1回目 国語 算数 理科 000012 試験2回目  国語 理科 社会 000013 試験3回目 国語 算数 社会 000014 卒業試験 理科 社会 科目名を一回で取得できるようなViewを作りたいのですが CREATE VIEW view_siken_kamoku ( siken_id, siken_name, kamoku_name1, kamoku_name2, kamoku_name3 ) AS SELECT siken.siken_id, siken.siken_name, kamoku.kamoku_name, kamoku.kamoku_name, kamoku.kamoku_name WHERE siken_kamoku_id1 = kamoku.kamoku_id AND siken_kamoku_id2 = kamoku.kamoku_id AND siken_kamoku_id3 = kamoku.kamoku_id; 以上の文ですとエラーがでます。 どのような文にすれば、上記のようなVIEWがえられますでしょうか おたすけてください

  • MySQL
  • 回答数1
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

テーブル構成が怪しいのでサンプル付きで create table kamoku (kamoku_id int(3) zerofill,name varchar(20)); insert into kamoku values(1,'国語'),(2,'算数'),(3,'理科'),(4,'社会'); create table siken (siken_id int(6) zerofill, siken_name varchar(20), kamoku_id1 int(3) zerofill, kamoku_id2 int(3) zerofill, kamoku_id3 int(3) zerofill); insert into siken values(11,'試験1回目',1,2,3),(12,'試験2回目',1,3,4),(13,'試験3回目',1,2,4),(14,'卒業試験',3,4,null); そこでviewは CREATE VIEW view_siken_kamoku(siken_id,siken_name,kamoku_name1,kamoku_name2,kamoku_name3) AS select siken_id,siken_name,coalesce(k1.name,''),coalesce(k2.name,''),coalesce(k3.name,'') from siken left join kamoku as k1 on k1.kamoku_id=kamoku_id1 left join kamoku as k2 on k2.kamoku_id=kamoku_id2 left join kamoku as k3 on k3.kamoku_id=kamoku_id3; 表示は select * from view_siken_kamoku; ところで、kamoku1~3の順番などに優劣はあるのでしょうか? 特に依存関係がないならもう少しデータをきれいに持った方が効率的だと思いますが・・・

ponkiti555
質問者

お礼

とても早く回答いただきありがとうございます。 すぐに作業ににとりかかりたいとおもいます。 なお VIEW名 siken_kamoku siken_id siken_name kamoku_id1 kamoku_id2 kamoku_id3 ------------------------------------------------------- 000011 試験1回目 国語 null 理科 000012 試験2回目 国語 国語 国語 000013 試験3回目 算数 null null 000014 卒業試験 null 理科 国語 000015 卒業試験 null null null なんでもありです。優劣もとににありません。 DBの構成があまりよくないのでしょうか。。。

関連するQ&A

  • 二次元配列のソート方法がわかりません

    下記のデータがあったときに、点数の低い人だけを表示するプログラムを作りたいのです。 ■データ <?php $data[] = array("kamoku" => "国語", "value" => "80", "name" => "島田","class"=>"5組"); $data[] = array("kamoku" => "算数", "value" => "98", "name" => "山田","class"=>"4組"); $data[] = array("kamoku" => "国語", "value" => "70", "name" => "島田","class"=>"5組"); $data[] = array("kamoku" => "理科", "value" => "10", "name" => "鈴木","class"=>"2組"); $data[] = array("kamoku" => "国語", "value" => "68", "name" => "島田","class"=>"5組"); $data[] = array("kamoku" => "理科", "value" => "35", "name" => "斉藤","class"=>"2組"); $data[] = array("kamoku" => "国語", "value" => "18", "name" => "鈴木","class"=>"2組"); $data[] = array("kamoku" => "理科", "value" => "90", "name" => "島田","class"=>"5組"); ?> ■結果(一番低い人だけを表示)   国語 18点 鈴木   算数 98点 山田   理科 10点 鈴木 どのようにソートすればよろしいでしょうか? 教えてくださいますようお願いします。

    • ベストアンサー
    • PHP
  • MySQLのデータをPHPで多次元連想配列にしたい

    MySQLのデータを多次元連想配列にする方法を教えて下さい。 下記のような多次元連想配列のデータがあります。 これと同様のMySQLに登録されたデータから多次元連想配列を作りたいと思います。 $test= array( array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90"), ); print_r($test); ---print_r($test)の結果--------------------------------- Array ( [0] => Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) [1] => Array ( [id] => 2 [kamoku] => 理科 [tensu] => 88 ) [2] => Array ( [id] => 3 [kamoku] => 国語 [tensu] => 90 ) ) -------------------------------------------------------- これと同様のデータをMySQLに作成します。 テーブル名:test 列名:id,kamoku,tensu MySQLからデータを取得 try { $dbh = new PDO($DSN , $DBUSER , $DBPASS); $query = select * from test $stmt = $dbh->prepare($query); $stmt->execute(); while($result = $stmt->fetch(PDO::FETCH_ASSOC)) { $id = ($result['id']); $kamoku = ($result['kamoku']); $tensu = ($result['tensu']); } } catch(PDOException $e) { print "Error!: " . $e->getMessage() . "<br>"; die(); } このソースの中で何らかの処理をして print_r($test); を実行したときに ---print_r($test)の結果--------------------------------- Array ( [0] => Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) [1] => Array ( [id] => 2 [kamoku] => 理科 [tensu] => 88 ) [2] => Array ( [id] => 3 [kamoku] => 国語 [tensu] => 90 ) ) -------------------------------------------------------- というような、文頭で記載したものと同じ結果を得たいと思います。 while内で print_r($result);を行うと1行ずつ下記のような連想配列 Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) が取得できているのでこれを連結させて $test_sample=<<<EOF array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90") EOF; という配列の中身は作ることができました。 (1)ケース1 $test=array($test_sample); print_r($test); としてもダメで、 Array ( [0] => array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90") ) というようにうまく多次元連想配列になっていません。 (2)ケース2 $test='array('.$test_sample.')'; print_r(test); としてみたところ、 array( array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90")) というように配列ではなく単なる文字列として表示されてしまいます。 配列の中身を変数で扱う時には特別な記述法などがあるのでしょうか?

    • ベストアンサー
    • PHP
  • 2つの異なるテーブルを和結合し、重複のない名前だけ出力する方法

    2つの異なるテーブルを和結合し、重複のない名前だけ出力させるSQLを書きたいのですが どこが間違っているでしょうか? select distinct name from ( select name from test1 union select name from test2 ) ; test1テーブル name 国語 算数 理科 社会 test1テーブル name 国語 体育 家庭科 社会 結果 name 国語 算数 理科 社会 体育 家庭科

  • 複数テーブルから値を連結出力するSQLについて

    以下の様な3つのテーブルがあり、それぞれのテーブルを連結して結果を取得したいと思っております。 この場合のSQL文をご教授いただけないでしょうか? 拙い説明でお分かりに難いかと思いますが、何卒、宜しくお願いします。 ●テーブル T1(科目テーブル) 科目ID, 科目名 T2(生徒テーブル) 生徒ID, 生徒名 T3(科目選択テーブル) 科目ID, 生徒ID(科目ID, 生徒IDで連結キー) ●期待出力結果イメージ ※例1)生徒ID=1の場合 科目ID | 科目名 | 生徒ID | 生徒名 ------------------------------------- 1 | 国語 | 1 | 山田太郎 ------------------------------------- 2 | 算数 | 1 | 山田太郎 ------------------------------------- 3 | 理科 | null | null ------------------------------------- 4 | 社会 | null | null ------------------------------------- 5 | 英語 | 1 | 山田太郎 ※例2)生徒ID=2の場合 科目ID | 科目名 | 生徒ID | 生徒名 ------------------------------------- 1 | 国語 | null | null ------------------------------------- 2 | 算数 | null | null ------------------------------------- 3 | 理科 | null | null ------------------------------------- 4 | 社会 | null | null ------------------------------------- 5 | 英語 | 2 | 鈴木花子 ●出力条件 科目テーブルの科目ID, 科目名は全て表示する。 T3(科目選択テーブル)に存在する生徒IDがあれば、その生徒ID、生徒名を表示する。 存在しない場合は、それぞれ「null」として表示する。 出力は生徒IDを条件とする。 何卒、宜しくお願いします。 ※因みに使用DBはMySQL5.1.44です。

    • ベストアンサー
    • MySQL
  • MySQLで合計と小計の計算方法を教えてください パート2

    MySQLで合計と小計の計算方法を教えてください パート2 name | kamoku | tensu         テーブル:testdb  --------------------------- 001    英語   95 001    国語   90 001    理科   75 001    社会   73 001    算数   62 002    英語   93 002    国語   87 002    理科   78 002    社会   71 002    算数   68 -------------------------------- 30人位いるのですが、やりたい事は以下になります。 基準点数(好きな点数を入力)$kijyunt sql = select sum(tensu) as stensu, sum(tensu)-(select count(*) * $kijyun from testdb) as hensa from testdb where tensu >= 70 全科目70点以上の点数を合計し、全体のレコード×70の点数を引き算したいのです。 しかしながらうまく表示しません。どこが悪いかご指摘お願いします。

    • ベストアンサー
    • MySQL
  • ReadParseで同名のinput名は配列で処理される?

    ReadPaeseでパラメータの受け渡しを行うのですが、CheckBoxの場合は、複数データが送れますが、textタイプやhiddenで同名のNameでフォームパラメータを送信した場合、受信側で配列として取得できるのでしょうか? それとも送る側で DATA1 DATA2 DATA3...のようにNameを付けて送信しないといけないのでしょうか? <INPUT text="KAMOKU" VALUE="国語"> <INPUT text="KAMOKU" VALUE="算数"> <INPUT text="KAMOKU" VALUE="理科"> <INPUT text="TEN" VALUE="60"> <INPUT text="TEN" VALUE="80"> <INPUT text="TEN" VALUE="70"> 国語60点と正しく順に取得できるかも心配 最悪これですか?3種ならこれでよいですが、増えると・・・ <INPUT text="KAMOKU1" VALUE="国語"> <INPUT text="KAMOKU2" VALUE="算数"> <INPUT text="KAMOKU3" VALUE="理科"> <INPUT text="TEN1" VALUE="60"> <INPUT text="TEN2" VALUE="80"> <INPUT text="TEN3" VALUE="70"> 以上です。

    • ベストアンサー
    • Perl
  • SQL文について知恵をかしてください!

    SQLについて皆さんのお知恵をかしてください 以下の表 tab01から Q01の結果を取り出すSQL文です 検索条件は以下の通り 1) 表tab01から、col1,col2,col3,col4 についてQ01へ出力 2) col2(char型)について "国語","算数","理科"を抽出 3) col4(date型)について「直近」の行のみ抽出    但し、Q01.col2において同じ値が発生する場合は、tab01.col1の値が    最も大きい行を抽出する(例:02,算数と10,算数) この要件を満たすSQL文はどう書けばよいでしょうか? なお、DBはoracle とします tab01 col1 col2 col3 col4  01  国語  80 20011211 02  算数  100 20011208 03  理科  80 20011201 04  国語  90 20011210 05  社会  100 20011209 06  算数  60 20011202 07  体育  80 20011205 08  国語  40 20011207 09  理科  70 20011210 10  算数  100 20011208 Q01 col1 col2 col3 col4 01  国語  80 20011211 10  算数  100 20011208 09  理科  70 20011210 どうかよろしくお願いいたします

  • 算数の問題です。

    かずやさんは、国語・算数・理科・社会の4つのテストを受けました。 どれも100点満点のテストです。 国語・算数・理科の平均点は国語の点より2点高く、国語・理科・社会の平均点は国語の点より6点低いとき、算数の点は社会の点より何点高くなりますか。   問題集の1問で、解説には、  (国語+算数+理科)-(国語+理科+社会)の点の差、つまり、算数と社会の点の差です。  2×3+6×3=24(点) とあります。どうしてこうなるのか、くわしく解説頂ける方、よろしくお願いします。

  • SQLの書き方

    わからないので質問をさせて頂きます。 テーブルAに、money、rank、name、IDと言うカラムがあります。 テーブルBに、IDとpointと言うカラム名があります。 テーブルAのIDを指定し、テーブルBに同じIDが存在する場合 テーブルAとBの値を取得するSQLを書いています。 Select テーブルA.money,テーブルA.rank テーブルA.name,テーブルA.ID,テーブルB.point FROM テーブルA,テーブルB Where テーブルA.ID = '5'; このように書くとmoney,rank,name、IDは重複して表示がされ pointに関してはすべてのpointが表示されてしまいます…。 重複するのでdistinctを使ったのですが うまくいかず…。 SQL初心者ですが、よろしければ教えてください。

    • ベストアンサー
    • MySQL
  • SQLで・・

    すみません、教えてください。 次のようなデータがあります。 table_A Name1 Name2 ----------- 1   2 3   4 table_B ID    Name --------------- 1     あ 2     い 3     う 4     え 次のような検索結果が欲しいとします。 Name1 Name2 ------------- あ    い う    え この結果を導くSELECT文はどう書けばいいでしょうか? 今、 select B.Name as Name1, C.Name as Name2 from table_A A, table_B B, table_B C where A.Name1=B.ID AND A.Name2=C.ID とやってみましたが、検索結果は0件になってしまいます。 お知恵をお貸しください!