[前][次][番号順一覧][スレッド一覧]

mysql:14823

From: SAKAI Kei <SAKAI Kei <sak2@xxxxxxxxxx>>
Date: Wed, 06 May 2009 14:59:54 +0900
Subject: [mysql 14823] Re: 【初歩的質問】 テーブルを結合するSQL文

坂井です。しまった、ちょっと間違いがありました。

> -----------------------------------  
> --方法の一例
> SELECT kumi.name, enji.name, kuda1.name, kuda2.name, kuda3.name
> FROM  kumi
>        LEFT OUTER JOIN enji ON (enji.kumi=kumi.no)
>        LEFT OUTER JOIN kuda kuda1 ON (enji.kuda1 = kuda1.no)
>        LEFT OUTER JOIN kuda kuda2 ON (enji.kuda2 = kuda2.no)
>        LEFT OUTER JOIN kuda kuda3 ON (enji.kuda3 = kuda3.no)
> WHERE  enji.kumi = kumi.no;
> -----------------------------------  
  
  最後の WHERE行 は不要です。
  (JOIN に移動したあと、消すのを忘れました。。動作としては今回は
    組みについては NULL が存在しないので変わりありません)

正しくは以下。
SELECT kumi.name, enji.name, kuda1.name, kuda2.name, kuda3.name
FROM  kumi
       LEFT OUTER JOIN enji ON (enji.kumi=kumi.no)
       LEFT OUTER JOIN kuda kuda1 ON (enji.kuda1 = kuda1.no)
       LEFT OUTER JOIN kuda kuda2 ON (enji.kuda2 = kuda2.no)
       LEFT OUTER JOIN kuda kuda3 ON (enji.kuda3 = kuda3.no);
       
+----------+------+--------+--------+--------+
| name     | name | name   | name   | name   |
+----------+------+--------+--------+--------+
| はな組み | 太郎 | イチゴ | ブドウ | ミカン |
| はな組み | 二郎 | ブドウ | リンゴ | ミカン |
| にじ組み | 三郎 | ミカン | NULL   | NULL   |
| にじ組み | 四郎 | リンゴ | ミカン | NULL   |
| そら組み | 五郎 | NULL   | NULL   | NULL   |
+----------+------+--------+--------+--------+
5 rows in set (0.00 sec)       


#カラム名がたまたまみんな「name」になってしまったので、
#必要に応じて適宜別名をつけてください^^;

thank you
On Wed, 06 May 2009 13:59:13 +0900
SAKAI Kei <sak2@xxxxxxxxxx> wrote:
> 坂井です
> 
>   nayaさん、こんにちは。
>   まず個人的な意見として言わせていただきたいのですが、質問の内容
>   が「初歩的」かどうかの判断ができない状態で「初歩的」と断定する
>   姿勢はあまりお勧めできません。
> #ちゃんと考えると、結構難しいですよ、これ。
> 
>   とりあえず一例としてこんな感じでやることができます。
>   
> -----------------------------------  
> --データを作りました:
> CREATE TABLE enji (kumi int, name varchar(64), kuda1 int, kuda2 int,
> kuda3 int);
> CREATE TABLE kuda (no int, name varchar(64));
> CREATE TABLE kumi (no int, name varchar(64));
> INSERT INTO enji VALUES 
> (1,"太郎",1,2,4),(1,"二郎",2,3,4),(2,"三郎",4,NULL,NULL),
> (2,"四郎",3,4,NULL),(3,"五郎",NULL, NULL, NULL);
> INSERT INTO kuda VALUES (1,"イチゴ"),(2,"ブドウ"),(3,"リンゴ"),(4,"ミカン");
> INSERT INTO kumi VALUES (1,"はな組み"),(2,"にじ組み"),(3,"そら組み");
> -----------------------------------  
> 
> 
> -----------------------------------  
> --方法の一例
> SELECT kumi.name, enji.name, kuda1.name, kuda2.name, kuda3.name
> FROM  kumi
>        LEFT OUTER JOIN enji ON (enji.kumi=kumi.no)
>        LEFT OUTER JOIN kuda kuda1 ON (enji.kuda1 = kuda1.no)
>        LEFT OUTER JOIN kuda kuda2 ON (enji.kuda2 = kuda2.no)
>        LEFT OUTER JOIN kuda kuda3 ON (enji.kuda3 = kuda3.no)
> WHERE  enji.kumi = kumi.no;
> -----------------------------------  
>   
>   やりたいことは
>      「園児テーブルを中心に、
>        このテーブルで 数字になっている部分を他のテーブルを
>        参照して名前をひっぱってくる」
>   ということだと思うので、考え方としては園児テーブルの四角を
>   真ん中に書いて、組みのカラムから組みマスターの四角へ線。
>   果物1のカラムから果物マスターの四角への線。
>   果物2からは、、、、、果物1とは値が違うため↑と同じ果物マスタ
>   の四角に線を引くわけに行かないですから、別の果物マスタの四角を
>   書いて線、、、というように、全部で5個の四角が線で結ばった状態
>   を思い浮かべると良いです。ただし NULL があるので単なる結合では
>   なく外部結合(≒相手がなくても表示)を使うわけです。
>   
>   
>   SQL、あまり感覚で覚えられるものでもないので、まずは適当なデータ
>   ベース関連(SQLについてたくさん書かれている本)を3,4冊腰を据えて
>   読まれると、かなりいろいろ分かってくると思いますよ^^
>   
>   
> thank you
>   
> On Wed, 06 May 2009 13:16:05 +0900
> naya <SNA02388@xxxxxxxxxx> wrote:
> > こんにちは。nayaと申します(MySQL 5.0.24)。
> > 
> > 
> > 以下のサンプルは、幼稚園児の、氏名と、所属する組みと、
> > 好きな果物(3つまで)を表すものです。
> > 
> > (1)〜(3)のテーブル及びマスターから、(4)の照会結果が得られる
> > SQL文をご教示下さい。
> > 
> > (1) 園児テーブル
> > 組み 氏名 果物1 果物2 果物3
> > 1  太郎   1  2  4
> > 1  二郎   2  3  4
> > 2  三郎   4  NULL NULL
> > 2  四郎   3  4  NULL
> > 3  五郎   NULL NULL NULL
> > 
> > (2) 果物マスター
> > 果物番号   果物名
> > 1      イチゴ
> > 2      ブドウ
> > 3      リンゴ
> > 4      ミカン
> > 
> > (3) 組みマスター
> > 組み番号  組み名
> > 1     はな組み
> > 2     にじ組み
> > 3     そら組み
> > 
> > (4) 期待する照会結果
> > はな組み 太郎 イチゴ ブドウ ミカン
> > はな組み 二郎 ブドウ リンゴ ミカン
> > にじ組み 三郎 ミカン NULL  NULL
> > にじ組み 四郎 リンゴ ミカン NULL
> > そら組み 五郎 NULL  NULL  NULL
> > 
> > なお、当方で考えた以下のSQLを実行すると、
> > 指数乗に大量な照会結果が得られてしまいます。
> > 
> > select * from 園児テーブル, 果物マスター, 組マスター
> >  where 園児テーブル.組み = 組みマスター.組み番号
> >  and 園児テーブル.果物1 = 果物マスター.果物番号
> >  and 園児テーブル.果物2 = 果物マスター.果物番号
> >  and 園児テーブル.果物3 = 果物マスター.果物番号
> > 
> > 
> > 当方、DBは、MS ACESSを使った経験もほとんどないですが、
> > MySQL5+PHP5でごく簡単なプログラムを作って勉強中の初心者レベルです。
> > よろしくお願い致します。
> > 
> > --
> > naya,
> > sna02388@xxxxxxxxxx
> 



[前][次][番号順一覧][スレッド一覧]

     14819 2009-05-06 13:16 [naya <SNA02388@xxxxx] 【初歩的質問】 テーブルを結合するSQL文  
     14820 2009-05-06 13:59 ┣[SAKAI Kei <sak2@xxxx]                                       
->   14823 2009-05-06 14:59 ┃┗[SAKAI Kei <sak2@xxxx]                                     
     14824 2009-05-06 20:26 ┃ ┗[naya <SNA02388@xxxxx] 【御礼】 Re: 【初歩的質問】 テーブルを結合するSQL文
     14826 2009-05-07 01:18 ┃  ┗["Kaname Kuji\(Y7\)" ] 【蛇足】Re:  【御礼】 Re:  【初歩的質問】 テーブルを結合するSQL文
     14825 2009-05-07 00:55 ┗["F.Yamazaki" <fumihi] SQL文、お知恵を拝借させてください     
     14827 2009-05-07 02:07  ┣[あきら <akirainfoml@]                                     
     14829 2009-05-07 02:48  ┃┗["F.Yamazaki" <fumihi]                                   
     14830 2009-05-07 11:07  ┃ ┗["Kaname Kuji\(Y7\)" ]                                 
     14834 2009-05-07 20:09  ┃  ┗[あきら <akirainfoml@]                               
     14828 2009-05-07 02:12  ┗[とみたまさひろ <tomm]