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

mysql:4293

From: (遠藤 俊裕) <<endo_t@xxxxxxxxxx>>
Date: Mon, 10 Sep 2001 22:07:42 +0900
Subject: [mysql 04293] Re: 2テーブル間で不一致のデータを抽出したい!

遠藤@横入り^^; です。

moeru@xxxxxxxxxx さんは書きました:
>①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

なぜ、DISTINCT を使いたいのか、っちゅうのはおいといて。。。。^^;

>「table1でtable2に入っていないuseridを抽出したい。」
>の場合、②が正しい書き方ってのでLEFT JOINの理解がますます難しくなってしまいました。。

これは、WHERE 句とか DISTINCT 句を抜いてデータを見て、select
するフィールドを * にしてみると違いが分かると思います。

それより、この sql の意味合いがちょっと分からないです。^^;
user.userid と table1.userid と table2.userid の関係は?
普通、こんな感じでしょう。

mysql> create table table1 ( userid int );
Query OK, 0 rows affected (0.11 sec)

mysql> create table table2 ( userid int, user char(20) );
Query OK, 0 rows affected (0.11 sec)

mysql> insert into table1 values ('1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into table1 values ('4');
Query OK, 1 row affected (0.00 sec)

mysql> insert into table2 values ('1', 'User1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into table2 values ('2', 'User2');
Query OK, 1 row affected (0.00 sec)

mysql> insert into table2 values ('3', 'User3');
Query OK, 1 row affected (0.00 sec)

mysql> select * from table1;
+--------+
| userid |
+--------+
|      1 |
|      4 |
+--------+
2 rows in set (0.00 sec)

mysql> select * from table2;
+--------+-------+
| userid | user  |
+--------+-------+
|      1 | User1 |
|      2 | User2 |
|      3 | User3 |
+--------+-------+
3 rows in set (0.00 sec)

mysql> select * from table1 left join table2 on table1.userid=table2.userid;
+--------+--------+-------+
| userid | userid | user  |
+--------+--------+-------+
|      1 |      1 | User1 |
|      4 |   NULL | NULL  |
+--------+--------+-------+
2 rows in set (0.00 sec)

この結果から、table2.userid が null である table1.userid が
欲しいデータなので、

mysql> select table1.userid from table1 left join table2
    -> on table1.userid=table2.userid
    -> where table2.userid is null;
+--------+
| userid |
+--------+
|      4 |
+--------+
1 row in set (0.01 sec)

ということになります。

>動いてしまうと、それが正しいと思ってしまって使ってしまいます(^^;

SQL は正しく記述しておく方が安全なので、こまめにチェック
しないと駄目ですね。
これ、私もよくはまります。^^;

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

      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]