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

mysql:4295

From: fuji <fuji <fujiyama@xxxxxxxxxx>>
Date: Mon, 10 Sep 2001 22:41:12 +0900
Subject: [mysql 04295] Re: 2テーブル間で不一致のデータを抽出したい!

fujiyamaです。
何か他の方がレスをつけてくださったようですが折角書いたので、、、

> ①SELECT DISTINCT user.userid 
>  FROM table1 LEFT JOIN table2 ON table1.userid=table2.userid,user 
>  WHERE table1.userid <> table2.userid
> 
> ②SELECT DISTINCT user.userid 
>  FROM table1 LEFT JOIN table2 ON table1.userid=table2.userid,user 
>  WHERE table2.userid is null
> 
> ①のtable1.userid <> table2.userid
> は、「table1でtable2に入っていないuseridを抽出したい。」
> というつもりでこう書きました。
> 
> ①②の違いは、日本語で書くとどういう解釈なんでしょうか?
> 
> 「table1でtable2に入っていないuseridを抽出したい。」
> の場合、②が正しい書き方ってのでLEFT JOINの理解がますます難しくなってしまいました。。

仕様では、
「もし、LEFT JOIN の ON や USING において右側のテーブルにマッチするレコー
ドが無かった場合、全てのフィールドがNULLである1つのレコードが、右側のテー
ブルとして使用されます。」
とあります。

ちょっとぶっちゃけた表現しますが、
JOIN構文でテーブルをくっつけます。
LEFT JOINの場合、左側のテーブル(ここではtable1)に右側のテーブル
(table2)どうやってくっつけるかの条件をON句で指定します。
この場合は、ON条件で同じ値を持ったフィールド同士を結びつけています。
この時、table1のフィールドにある値が、右側のテーブル(table2)に無い場合
も当然考えられます。table1に加えるデータがない状態です。
で、値があるところはフィールド有り、ないところだけフィールドなしなんてい
うことはDB上困るので、何かフィールドに値を入れる必要があります。
仕様ではNULL値をフィールドに入れることにしました。

この辺は言葉で読んでも多分よく分からないので、実際にSQLつくって出力させ
てみるといいと思います。

例)
table1.userid
a               
b
c

table2.userid
a
b

SELECT table1.userid as t1 , table2.userid as t2 
  FROM table1 LEFT JOIN table2 ON table1.userid=table2.userid;

SELECT table1.userid as t1 , table2.userid as t2 
  FROM table1 JOIN table2;


実行例
LEFT JOIN 
t1   t2
___________
a    a
b    b
c    NULL

JOIN
t1  t2
___________
a    a
a    b
b    a
b    b
c    a
c    b


で、先の例だと出来上がったtable2.useridでNULLのものができるわけです。
そしてNULLの計算についてですが、これは班石さんの書いているように
「NULL は他の全ての値(たとえ NULL でも)と比較した時に、常に偽になる値で
す」
とあり、つまりNULLは比較できません。
table2.useridはNULLが入っているので、本来「<>」で比較はできないはずと
いうことです。
比較できるんだったら(1)でもいいと思いますよ。

#○1=①は機種依存文字だそうで、先日注意しなさいと言われました(^^;


> >> *関係ないですけど、php-4.0.6のmail()関数が使えなくてはまってます(;_:)

> 試しにPROG_SENDMAIL=/var/qmail/bin/qmail-inject
> をexportしてから、PHPをコンパイルしたら
> 今日、上手くいきました(^^)

こちらはめでたしめでたし。

--お世話になっています 
fuji <fujiyama@xxxxxxxxxx>


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

      4270 2001-09-03 16:18 ["yasushi fujiwara" <] 2テーブル間で不一致のデータを抽出したい!
      4271 2001-09-03 16:54 ┣[<endo_t@xxxxxxxxxx> ]                                       
      4272 2001-09-03 17:52 ┣[madara <madara@xxxxx]                                       
      4273 2001-09-03 19:39 ┃┗["yasushi fujiwara" <]                                     
      4274 2001-09-03 19:54 ┃ ┣[fuji <fujiyama@xxxxx]                                   
      4277 2001-09-03 21:49 ┃ ┗[<endo_t@xxxxxxxxxx> ]                                   
      4278 2001-09-03 23:02 ┃  ┗["yasushi fujiwara" <]                                 
      4289 2001-09-09 08:15 ┃   ┗[<moeru@xxxxxxxxxx>  ]                               
      4290 2001-09-10 13:08 ┃    ┣[fuji <fujiyama@xxxxx]                             
      4292 2001-09-10 21:23 ┃    ┃┗[<moeru@xxxxxxxxxx>  ]                           
      4293 2001-09-10 22:07 ┃    ┃ ┣[<endo_t@xxxxxxxxxx> ]                         
      4294 2001-09-10 22:19 ┃    ┃ ┣[とみたまさひろ <tomm]                         
->    4295 2001-09-10 22:41 ┃    ┃ ┗[fuji <fujiyama@xxxxx]                         
      4298 2001-09-12 00:23 ┃    ┃  ┗[<moeru@xxxxxxxxxx>  ]                       
      4291 2001-09-10 13:31 ┃    ┗[madara <madara@xxxxx]                             
      4275 2001-09-03 19:54 ┗[Tomohiro 'Tomo-p' KA]