2009年5月 6日

[mysql 14820] Re: 【初歩的質問】 テーブルを結合するSQL文

坂井です

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@xxxxx> 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@xxxxx


投稿者 xml-rpc : 2009年5月 6日 13:59
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/84840
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。