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]