mysql:9787
From: <ml_mysql@xxxxxxxxxx>
Date: Wed, 07 Jul 2004 00:58:22 +0000
Subject: [mysql 09787] Re: EXCEPT のMysqlで代替方法。
松枝 さん ありがとうございました。 At 23:39 04/07/06 +0900, you wrote: > こんにちは。 > >ml_mysql@xxxxxxxxxxさんの ><4.2.0.58.J.20040706221822.05d01074@xxxxxxxxxx> >"[mysql 09784] EXCEPTのMysqlで代替方法。" > > >> 現在は、SELECT mail_address FROM table_b GROUP ON mail_address >> で 変数 $where に全て読み込んで、"aa@xxxxxxxxxx","bb@xxxxxxxxxx",……のようにし >> >> SELECT * FROM table_a WHERE mail_address NOT IN "$where" >> >> としていますが、 > > なんか豪腕と言うか、凄いやり方を思いつきましたね。普通はこんなクエリで >やります。 > > SELECT table_a.* > FROM table_a LEFT JOIN table_b USING(mail_address) > WHERE table_b.mail_address IS NULL; > なるほど、LEFT JOIN で結合させれば、table_b にないレコードは table_b 内の項目は、NULL になる 従って、NULL のレコードだけを取り出せば、EXCEPT と 同じになる。 ということですね。 ありがとうございます。 どうも、私は、頭が固いようで、そこまで思いつきませんでした。 > > > table_aとtable_bでmail_addressは重複するのでしょうか?また、それぞれの >テーブルで mail_addressは重複するのでしょうか?どちらかの答が重複するで >あり、その重複度が高いならば、正規形に持っていく事、テーブルの再設計を考 >えた方が良いでしょう。 >> table_a が約100万件、table_b が現在は数百件ですが、早い時期に数万件に >> なりそうです。 >の様な事であれば、特に、ですね。 ありがとうございます。そうですね、正規化がいまいち、出来ていないですね。 現実には、table_a もTable_b も user_id を持っていて、 user_id とmail_address でユニークになります。 継ぎ足し継ぎ足し出来ているシステムで、 正規化すると、修正ソフトがたくさん出てきて、 いつかはやらないととは思っているのですが、つい動いてるもので(^^ゞ > > 具体的にはmail_addressとそのインデックス値(例えばカラム名を ma_indexと >でもしましょう)を持つテーブルを新設し、 table_a、 table_bから >mail_addressを取り去りma_indexを追加します。 > > ありがとうございます。 > > 松枝知直 <tomom@xxxxxxxxxx> > http://www.argus.ne.jp/~tomom/ > >
9784 2004-07-07 07:33 [<ml_mysql@xxxxxxxxxx] EXCEPT のMysqlで代替方法。 9785 2004-07-06 23:39 ┗[ML account <ml@xxxxx] 9786 2004-07-06 23:47 ┣[ML account <ml@xxxxx] -> 9787 2004-07-07 09:58 ┗[<ml_mysql@xxxxxxxxxx]