• 締切済み

まだSQL初心者なので、よくわかっていないようです。

まだSQL初心者なので、よくわかっていないようです。 Viewの作り方がうまくいきません。 各テーブルの数値(PLAYCNT)の合計数を出力する VIEWを作成したいだけなのですが。。 これ↓を実行すると、mysqladminがフリーズしたようになって レコード数に~02(2は乗数) という変な数字が入ってしまいます。 これはいったいどうしてなのか分からず困っています。 CREATE VIEW ALLPLAY_TBL AS SELECT SUM(A.PLAYCNT) NORMAL_CNT, SUM(B.PLAYCNT) HARD_CNT, SUM(C.PLAYCNT) SPECIAL_CNT, SUM(D.PLAYCNT) MANIAC_CNT FROM NORMAL_TBL A, HARD_TBL B, SPECIAL_TBL C, MANIAC_TBL D

  • MySQL
  • 回答数5
  • ありがとう数18

みんなの回答

回答No.5

MySQLのバージョンを、最低でもMySQL 5.0、MySQL 5.1レベルまでは明記するようにしてください。また、機能によっては、MySQL 5.1.xxといったマイナーチェンジででも仕様変更されているケースもありますので、環境を具体的に提示するようにしてください。 また、単に「エラーになる」といったことでなく、具体的なメッセージなどを提示してください。それが、他人が検証する上で、大きな手がかりになります。 「FROM句でサブクエリを書けない」という制限は、私が使用しているMySQL 5.1.36でも残っています。 <方法1>ダミーの表を使いSELECT句で集計 他の方が提示されているORACLEでいうDUALは、MySQLは未実装です。しかし、MySQLでは「FROM 表名」自体を書かない構文があります。 DROP VIEW IF EXISTS ALLPLAY_TBL; -- "FROM tablename"構文自体を省略 CREATE VIEW ALLPLAY_TBL AS SELECT (SELECT SUM(PLAYCNT) FROM NORMAL_TBL) AS NORMAL_CNT ,(SELECT SUM(PLAYCNT) FROM HARD_TBL) AS HARD_CNT ,(SELECT SUM(PLAYCNT) FROM SPECIAL_TBL) AS SPECIAL_CNT ,(SELECT SUM(PLAYCNT) FROM MANIAC_TBL) AS MANIAC_CNT ; SELECT * FROM ALLPLAY_TBL; <方法2>UNIONで4表を1表のように扱う。集計はビュー操作時に行う 現在の表の構成では、4表を1表のように操作するケースがいろいろあるでしょう。 DROP VIEW IF EXISTS ALLPLAY_TBL; -- "UNIONで4表を1表のように操作 CREATE VIEW ALLPLAY_TBL AS SELECT PLAYCNT AS NORMAL_CNT,0 AS HARD_CNT,0 AS SPECIAL_CNT,0 AS MANIAC_CNT FROM NORMAL_TBL UNION ALL SELECT 0 AS NORMAL_CNT,PLAYCNT AS HARD_CNT,0 AS SPECIAL_CNT,0 AS MANIAC_CNT FROM HARD_TBL UNION ALL SELECT 0 AS NORMAL_CNT,0 AS HARD_CNT,PLAYCNT AS SPECIAL_CNT,0 AS MANIAC_CNT FROM SPECIAL_TBL UNION ALL SELECT 0 AS NORMAL_CNT,0 AS HARD_CNT,0 AS SPECIAL_CNT,PLAYCNT AS MANIAC_CNT FROM MANIAC_TBL ; -- 集計はビュー操作で SELECT SUM(NORMAL_CNT),SUM(HARD_CNT),SUM(SPECIAL_CNT),SUM(MANIAC_CNT) FROM ALLPLAY_TBL; 上記の例では、全体のPLAYCNTのみ集計していますが、これにプレイヤーを識別するIDなどもSELECT句で選択するようにすれば、プレイヤー毎の集計など、いろいろな操作が可能になります。

KOGANESAKI
質問者

お礼

とても勉強になります。 FROM句を省略できるんですね。。驚きです。 サンプルコードまで記載頂き感謝この上ありません。 じっくりと確認させていただきます。 ちなみに、コピペでバッチリOKでした! ありがとうございます。 # アプリの方も無事完成し、本日リリースできました。 # mixiアプリでフリーセルのアプリを作っていたので # こういうカラム名になっていました。

  • mako_sea
  • ベストアンサー率47% (62/130)
回答No.4

出力が列から行に変わってしまいますが、 ユニオンしてみるのはいかがでしょうか。 CREATE VIEW ALLPLAY_TBL AS SELECT SUM(A.PLAYCNT) NORMAL_CNT FROM NORMAL_TBL A union all SELECT SUM(B.PLAYCNT) HARD_CNT FROM HARD_TBL B union all SELECT SUM(C.PLAYCNT) SPECIAL_CNT FROM SPECIAL_TBL C union all SELECT SUM(D.PLAYCNT) MANIAC_CNT FROM MANIAC_TBL D

KOGANESAKI
質問者

お礼

すみません、放置してしまっていました。 ご提示の方法がいいと思いました。 たいへんありがとうございます。

回答No.3

結合がいらなかったんですね きちんと質問を読んでいませんでした この副問い合わせならどうでしょうか select (select sum(PLAYCNT) sm from NORMAL_TBL) as NORMAL_CNT, (select sum(PLAYCNT) sm from HARD_TBL) as HARD_CNT, (select sum(PLAYCNT) sm from SPECIAL_TBL) as HARD_CNT, (select sum(PLAYCNT) sm from MANIAC_TBL) as MANIAC_CNT from dual 私はオラクルを使用しているためasなど必要なければ削除してください なおdualはダミーテーブルです MySQLはバージョン 4.1.0 以降が対応しているようです

KOGANESAKI
質問者

お礼

ありがとうございます。 しかし!やっぱりだめでした。 エラーも、結果も出ずという動きをしました。 もう少し色々と調べてみます。

  • mako_sea
  • ベストアンサー率47% (62/130)
回答No.2

たぶんPLAYCNTの値を合計した副照会をしておけば 大丈夫だと思うのですが。 以下で改善されるように思います。 CREATE VIEW ALLPLAY_TBL AS SELECT A.CNT AS A_CNT, B.CNT AS B_CNT, C.CNT AS C_CNT, D.CNT AS D_CNT FROM (SELECT SUM(PLAYCNT) AS CNT FROM NORMAL_TBL ) A , (SELECT SUM(PLAYCNT) AS CNT FROM HARD_TBL ) B , (SELECT SUM(PLAYCNT) AS CNT FROM SPECIAL_TBL ) C (SELECT SUM(PLAYCNT) AS CNT FROM MANIAC_TBL ) D ;

KOGANESAKI
質問者

お礼

ありがとうございます。 しかしながら ビューの定義のSELECT文のFROM句では サブクエリは使えません。でエラーとなりました。 MySQLのビューの制限事項なのかなぁと思われます。 もう少し基本からやりなおしてみます。

回答No.1

まずViewを作成するというよりSQLの基本を勉強したほうがいいでしょう ここに4つのテーブルがありますが 結合されていません そのためフリーズしてしまうんです 結合していない場合は、全あたりの結果がでてきますのでたぶんdbの限界か何かで結果が^で表示されるのでしょう まずは where a.[項目名] = b.[項目名] and a.[項目名]=c.[項目名] and a.[項目名]=d.[項目名] といったような内部結合または外部結合を作成して下さい このSQLの結果が自分が欲しいものであれば CreateをつけてViewを作成すればいいですよ

KOGANESAKI
質問者

お礼

ありがとうございます。 4つの表にリレーションがあるわけではなく 各レコードに記録されたある列の合計数 取得したいだけなのですが AのPlayCNTの合計 | Bの…合計 | Cの…合計 |Dの…合計 色々結合ためしてみてもやっぱりうまくいかず もう少し調べてみます。

関連するQ&A

  • mysqlのsql文について質問です

    tbl_aとtbl_bから、tbl_cを作りたいのですが どのようなsql文を書けば良いでしょうか? アドバイス頂けると嬉しいです。よろしくお願い致します。 テーブル:tbl_a ----------------- code1,code2,name ----------------- 001,a,あ 002,a,あ 003,a,あ 004,a,あ 005,b,い 006,b,い 007,b,い 008,c,う 009,c,う 010,c,う 011,c,う 012,d,え 013,d,え 014,d,え テーブル:tbl_b ----------------- code1,point ----------------- 003,10 004,2 008,10 009,5 011,20 テーブル:tbl_c ----------------- code2,name,point ----------------- a,あ,2 b,い, c,う,5 d,え,

    • ベストアンサー
    • MySQL
  • ACCESS2000 SQL 最大レコード数

    こんにちは。 [TBL] キーは A B DD Cです。 A B DD C E 1 2 21 7 ..... 1 2 21 8 ..... 1 2 22 3 ..... 1 2 22 8 ..... 1 2 22 9 ..... 3 1 2 1 ..... 3 3 4 2 ..... から、A=1 B=2の数の最大レコード数をカウントしたいです。 但し、DDは同じ数なことが条件です。 上でいうと、D=22のものが3つあり、D=21のものが2つあるので、最大は3ということで、3を取得したいです。 select count(*) FROM TBL where A=1 AND B=2 GROUP BY C に近い感じだとはおもうのですが。 よろしくお願い致します。

  • 副問い合わせで複数の列を返す

    こんにちは、Makotoと申します。 SQLの副問い合わせで質問があるのですが、 現在のSQLは CREATE OR REPLACE VIEW VIWTEST AS SELECT KOMOKU1, KOMOKU2 (SELECT SUM(KOMOKU3) FROM TBL WHERE A = 1 (SELECT SUM(KOMOKU4) FROM TBL WHERE A = 1 (SELECT SUM(KOMOKU5) FROM TBL WHERE A = 1 FROM M_TBL; という感じのSQLなのですが、副問い合わせの所 が見ているテーブルも条件も一緒なので1つにまとめたいのですが、うまくいきません。CURSORという関数があったのですが、VIEWでは使用できませんでした。なにかよい方法はないでしょうか? 開発環境は oracle 9i(AIX) pro*C/C++ でおこなっています。

  • SQL

    SQLの初心者です。 次のようなテーブルがあるとします。 項目:A , B , C , D このテーブル合計を求めたいのです。 条件は、 同一テーブルでB=10の時のAの合計とD=10の時のCの合計の合計です。 B=10の時のAの合計は「sql sum(A) from テーブル where B=10」となります。 D=10の時のCの合計は「sql sum(C) from テーブル where D=10」となります。 この2つの合計を求めたいのです。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • 3テーブルより抽出のSQL文

    3テーブルよりを以下の条件で1つのSELECT文で抽出したいのですが可能でしょうか?  ・C_TBLのDATEが2007のデータ〔SUBSTR(DATE,1,4)='2007'を使用?〕  ・A_TBLのCORPがcorp1のデータ(あいまい検索)  ・CORP(昇順)、DATE(降順)、ITEM(昇順)でソート ・表示カラムは、CORP・DATE・ITEM・SURYO・TANKAです <<A_TBL>>   <<B_TBL>>         <<C_TBL>> A  CORP    B  A  ITEM TANKA   C  A  B   DATE  SURYO a01 corp11   b01 a02 item03 10   c01 a03 b06 2007-11-01 100 a02 corp13   b02 a03 item01 20   c02 a01 b03 2007-12-01 200 a03 corp11   b03 a01 item03 10   c03 a05 b04 2007-11-01 100 a04 corp05   b04 a05 item02 30   c04 a01 b05 2007-11-01 300 a05 corp13   b05 a01 item02 30   c05 a03 b06 2007-12-01 200            b06 a03 item03 20   c06 a01 b05 2007-11-02 100            b07 a01 item01 10   c07 a03 b02 2007-11-01 500 また、以下の条件で集計を1つのSELECT文で行えますか? 現在は、C_TBLとB_TBLで集計抽出し、A_TBLの対象データを抽出し、2つの配列より・・・ というロジックを組んでいます。  ・C_TBLのDATEが2007のデータ〔SUBSTR(DATE,1,4)='2007'を使用?〕  ・A_TBLのCORPがcorp1のデータ(あいまい検索)  ・CORP(昇順)、DATE(降順)でソート ※DATEは年月のみです  ・CORP、DATE(年月)毎で金額を集計〔SUM(C_TBL.SURYO*B_TBL.TANKA) AS KINGAKU〕 ・表示カラムは、CORP・DATE・金額です 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • 行ごとに連番を付けたい

    例えば下記のようなデータがあったときに "Name","sub","cnt" A,a,100 B,a,200 A,b,150 A,c,110 B,b,250 ビューで WHERE (sub >= b) で A,b,150 B,b,250 を取得するのは簡単なのですが 1,A,b,150 2,B,b,250 と取得した行に対して連番を付けていきたいのですが できないでしょうか? CREATE TABLE #t ( No int IDENTITY(1,1), Name char(200), sub char(200), cnt int ) INSERT INTO #t( Name , sub , cnt ) SELECT ・・・・・・・・ とストアドではできるのですが、 ビューでできたらやりたいのです。 お願いいたします。

  • 3テーブルの外部結合

    3テーブルよりを以下の条件で1つのSELECT文で集計したいのですが可能でしょうか?  ・A_TBLのA単位でB_TBLのNYUKAとC_TBLのSYUKAを集計 <<A_TBL>>   <<B_TBL>>     <<C_TBL>> A  STOCK   B  A NYUKA   C  A SYUKA a01  100    b01 a02 10   c01 a03 10 a02  200    b02 a01 20   c02 a01 20 a03  300    b03 a01 10   c03 a05 10 a04  400    b04 a03 30   c04 a01 30 a05  500    b05 a05 30   c05 a03 20            b06 a02 20   c06 a01 10            b07 a01 10   c07 a03 50 外部結合 SELECT a.A,a.STOCK,SUM(b.NYUKA) AS SUM_NYUKA,SUM(c.SYUKA) AS SUM_SYUKA FROM A_TBL AS a". LEFT OUTER JOIN B_TBL AS b ON a.A=b.A LEFT OUTER JOIN C_TBL AS c ON a.A=c.A". GROUP BY a.A でうまくいきません。3つ以上のテーブルの外部結合の記述が間違っているのはわかるのですが、 どのように記述すればよいか、ネットで検索してもわかりませんでした。 宜しくお願い致します。

  • シンプルなSQLの書き方がわかりません。

    以下のSQLをシンプルに一つにしたいのですが、どのように書いたらよろしいでしょうか? どうぞご返答頂けますようお願い申し上げます。 --test1_tblの抽出 select a1 as a1, b1 as b1 from a_tbl where c=1 --test2_tblの抽出 select a1 as a1, e1 as e1 from b_tbl where rowid in (select min(rowid) from ee group by a1) and a1 is not null and a1 !=' ' order by a1 --test1_tblとtest2tblの結合 select t0.a1 as a1, t0.b1 as b1, t1.e1 as e1 FROM test1_tbl t0, test2_tbl t1 WHERE (t0.a1 = t1.a1)

  • SQLで後方の文字列を置換する方法

    表現方法が稚拙で申しわけありませんが。 あるテーブルに存在する値を、他のテーブルにある値と前方一致で結合したいと思います。 (1)TBL_A(項目名はA) (a) 10230 (b) 11350 (c) 30040 (2)TBL_B(項目名はB) (d) 10200 (e) 11000 (f) 30000 (形式はVARCHAR2,値は数字のみで長さは固定) 上記のようなデータで、TBL_Bに関しては後ろの「0」は無視して 前方一致で結合したいのです。 つまり、(a)と(d)、(b)と(e)、(c)と(f)が結合されるようにしたいのです。 SQL文で表現すると、次のようになります。 TBL_A.A LIKE '102%' OR TBL_A.A LIKE '11%' OR TBL_A.A LIKE '3%' これを次のようなSQLで記述してみました。 TBL_A.A LIKE SUBSTR(TBL_B.B,1,INSTR(TRANSLATE(TBL_B.B,'123456789','XXXXXXXX'),'X',-1,1)) || '%' 以上のSQLで問題ないと思いますが、もっとシンプルな方法があればお教え願います。 DBはORACLE9iです。

  • sqlについて

    下に書いたsqlのコードの内容(どういう処理でどういう結果になるのか)が知りたいです。 どなたかわかる方教えてください。 select b.ym, b.no,     isnull(e.sumcnt,0)as val, null as bunsi, null as bunbo from (select distinct ym,no from Table_A)b inner join (select ym from Table_B where cd=1)d on b.ym=d.ym left outer join (select b1.ym,b1.no,sum(c1.cnt)as sumcnt from Table_A b1 inner join (select ym from Table_B where cd=1)d1 on b1.ym=d1.ym inner join Table_C c1 on b1.ym=c1.ym group by b1.ym,b1no)e on b.ym=e.ym and b.no=e.no