mysql:14830
From: "Kaname Kuji\(Y7\)" <"Kaname Kuji\(Y7\)" <kkuji@xxxxxxxxxx>>
Date: Thu, 7 May 2009 11:07:54 +0900
Subject: [mysql 14830] Re: SQL文、お知恵を拝借させてください
KK@IB です。 これも蛇足っぽいのですが... 5でなくてもサブクエリは使えます。 基本的には、名前とフルーツ名を掛け合わせた重複しないすべての組み合わせ から、最初に設定されたデータを取り除いたものが答ですから... 表示中の列 0 - 2 (3 合計, クエリの実行時間 0.0021 秒) 実行した SQL: SELECT yname, fname FROM `names` , f2 WHERE concat( yname, fname ) IN ( SELECT DISTINCT ( concat( yname, fname ) ) FROM `names` , f2, Q2 WHERE concat( yname, fname ) NOT IN ( SELECT concat( nm, fruitname ) FROM Q2 ) ) LIMIT 0 , 30 yname fname Inoue Apple Aoki Orange Inoue Grape --------------------------- SELECT version( ) version() 4.1.22-standard ------------------------------- しかし、残念ながら、すでに提示されたSQL文のほうが効率が良いようです。 実行した SQL: EXPLAIN SELECT DISTINCT t1.nm, t2.fruitname FROM ( Q2 t1, Q2 t2 ) LEFT JOIN Q2 t3 ON t1.nm = t3.nm AND t2.fruitname = t3.fruitname WHERE t3.nm IS NULL id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 9 Using temporary 1 SIMPLE t2 ALL NULL NULL NULL NULL 9 1 SIMPLE t3 ALL NULL NULL NULL NULL 9 Using where; Not exists; Distinct -------------------------------------------------------------------------------- 実行した SQL: EXPLAIN SELECT yname, fname FROM `names` , f2 WHERE concat( yname, fname ) IN ( SELECT DISTINCT ( concat( yname, fname ) ) FROM `names` , f2, Q2 WHERE concat( yname, fname ) NOT IN ( SELECT concat( nm, fruitname ) FROM Q2 ) ) id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY names index NULL PRIMARY 10 NULL 3 Using index 1 PRIMARY f2 index NULL PRIMARY 10 NULL 4 Using where; Using index 2 DEPENDENT SUBQUERY names index NULL PRIMARY 10 NULL 3 Using index; Using temporary 2 DEPENDENT SUBQUERY f2 index NULL PRIMARY 10 NULL 4 Using where; Using index 2 DEPENDENT SUBQUERY Q2 index NULL PRIMARY 8 NULL 9 Using where; Using index; Distinct 3 DEPENDENT SUBQUERY Q2 ALL NULL NULL NULL NULL 9 Using where >> 4.0だとサブクエリが使えませんよね? >> >> SELECT >> DISTINCT food >> FROM >> table1 >> WHERE >> food not in ( select food from table1 where name = '井上' ) >> >> サブクエリが利用できればこんな感じでしょうか > > はい。これに近いものは何度も試していたのですが、エラーが出ていました。 > Ver.4でサブクエリが使えないのが原因だったのですね。無知でした。 > >> SELECT >> food, sum(IF(name='井上',1,0)) as ct >> FROM >> table1 >> GROUP BY >> food >> > これの動作、確認させていただきました。 > いい感じです。 > >> 試行錯誤の末、次のようにしたらそれっぽいリストが抜け出せました。 >> >> mysql> select distinct t1.name,t2.food from (table1 t1, table1 t2) left >> join table1 t3 on t1.name=t3.name and t2.food=t3.food where t3.name is >> null; >> +------+--------+ >> | name | food | >> +------+--------+ >> | 井上 | りんご | >> | 青木 | みかん | >> | 井上 | ぶどう | >> +------+--------+ >> >> MySQL 4.0 が入手できなかったので、5.1.31 での結果ですけど。 >> > こちらのとみた様の提示いただいたものも、確認できました。Ver.4でも同結果得られました。 > ご苦労頂きありがとうございました。とりあえず、こちらのものを使わせていただきたいと思います。 > > とは言うものの、サブクエリが使えると何かと便利そうですので、機会を見てVer.5へ変更してみ > ようと思います。
14819 2009-05-06 13:16 [naya <SNA02388@xxxxx] 【初歩的質問】 テーブルを結合するSQL文 14820 2009-05-06 13:59 ┣[SAKAI Kei <sak2@xxxx] 14823 2009-05-06 14:59 ┃┗[SAKAI Kei <sak2@xxxx] 14824 2009-05-06 20:26 ┃ ┗[naya <SNA02388@xxxxx] 【御礼】 Re: 【初歩的質問】 テーブルを結合するSQL文 14826 2009-05-07 01:18 ┃ ┗["Kaname Kuji\(Y7\)" ] 【蛇足】Re: 【御礼】 Re: 【初歩的質問】 テーブルを結合するSQL文 14825 2009-05-07 00:55 ┗["F.Yamazaki" <fumihi] SQL文、お知恵を拝借させてください 14827 2009-05-07 02:07 ┣[あきら <akirainfoml@] 14829 2009-05-07 02:48 ┃┗["F.Yamazaki" <fumihi] -> 14830 2009-05-07 11:07 ┃ ┗["Kaname Kuji\(Y7\)" ] 14834 2009-05-07 20:09 ┃ ┗[あきら <akirainfoml@] 14828 2009-05-07 02:12 ┗[とみたまさひろ <tomm]