- - PR -
MySQLでの多重テーブル結合について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-07-18 04:45
お世話になります。
基本的なことで恐縮ですが、ちょっとご教授願いたいのですが… 以下のSQL文ですが、もっと簡潔で早く処理できるようにすることは出来ますでしょうか? ※MySQL 4.0.2x SELECT a.*, b.meta_value AS m_bbb, c.meta_value AS m_ccc, d.meta_value AS m_ddd, e.meta_value AS m_eee, f.meta_value AS m_fff, g.meta_value AS m_ggg, h.meta_value AS m_hhh, i.meta_value AS m_iii, j.meta_value AS m_jjj, FROM `base` AS a INNER JOIN `option` AS b ON a.ID = b.base_id INNER JOIN `option` AS c ON a.ID = c.base_id INNER JOIN `option` AS d ON a.ID = d.base_id INNER JOIN `option` AS e ON a.ID = e.base_id INNER JOIN `option` AS f ON a.ID = f.base_id INNER JOIN `option` AS g ON a.ID = g.base_id INNER JOIN `option` AS h ON a.ID = h.base_id INNER JOIN `option` AS i ON a.ID = i.base_id INNER JOIN `option` AS j ON a.ID = j.base_id WHERE b.meta_key='bbb' AND c.meta_key='ccc' AND d.meta_key='ddd' AND e.meta_key='eee' AND f.meta_key='fff' AND g.meta_key='ggg' AND h.meta_key='hhh' AND i.meta_key='iii' AND j.meta_key='jjj' やりたいことは、baseテーブルに関連するoptionテーブル内のmeta_keyに登録されている値を、そのmeta_keyをフィールドとしてbaseテーブルの結果に付加してすべてのmeta_keyの情報を関連取得したいという事です。 以上、宜しくお願いいたします。 | ||||
|
投稿日時: 2008-07-18 05:43
SQLだけ示して、表の列構成や関連は、アドバイスしようとする人に読み解いて
ということですか? 表の列構成、表と表の関連、データ例くらいは、最低限、示しましょう。
母体データ件数はどのくらいあり、検索対象データはそのうちどのくらいで、どういう インデクスを定義済ですか? | ||||
|
投稿日時: 2008-07-18 09:17
簡潔もなにも
なんでoptionをずらずらと結合してるのか理解できないや 普通にひとつ結合して caseあたりでmeta_keyを見てm_bbbを出す出さないを判断すればいいんでは? case when meta_key = 'ccc' then meta_value end m_ccc ・・・以下つづく みたいな感じで | ||||
|
投稿日時: 2008-07-18 14:10
忠犬さま、
ベーステーブルは100件、オプションテーブルは1200件くらいです。 ベーステーブル ID、フィールド1、フィールド2、フィールド3…フィールド20 オプションテーブル(ベース1件につき、10〜20件くらい付加されます) オプションID、ベースID、メタキー、メタバリュー の様な感じです。 ずらずらと並べていたのは、caseを使ったSQLがなかなか通らなくて、単純に結合して書けば普通に5つくらいまでは結合しても実行できたから書きました。 以上、よろしくお願いいたします。 | ||||
|
投稿日時: 2008-07-18 15:03
SQL一発でやるんなら、それでいいんじゃないでしょうか。
| ||||
|
投稿日時: 2008-07-18 15:41
では、そのcaseを使ったSQLを提示してみてはどうでしょうか? 「もっと簡潔で早く処理できるように」ですよね?CASEが良いと思います。 | ||||
|
投稿日時: 2008-07-18 15:54
MySQLならIF関数が良いのでは。
CASE式より簡潔に掛けますよ。OracleのDECODEのように。 ... IF(meta_key = 'bbb', meta_value, NULL) m_bbb, IF(meta_key = 'ccc', meta_value, NULL) m_ccc, ... [ メッセージ編集済み 編集者: くまっち 編集日時 2008-07-18 15:55 ] | ||||
|
投稿日時: 2008-07-18 16:03
よっしーさん、有り難う御座います。
一様以下のような感じで書いてたのですが、通りませんでした。 たぶんどこか書き方が間違っていると思うのですが… SELECT a.*, CASE b.meta_key='bbb' THEN b.meta_value ELSE '0' END m_bbb, CASE b.meta_key='ccc' THEN b.meta_value ELSE '9' END m_ccc, CASE b.meta_key='ddd' THEN b.meta_value ELSE 'N' END m_ddd, CASE b.meta_key='eee' THEN b.meta_value ELSE '0' END m_eee, CASE b.meta_key='fff' THEN b.meta_value ELSE '0' END m_fff, CASE b.meta_key='ggg' THEN b.meta_value ELSE '0' END m_ggg, CASE b.meta_key='hhh' THEN b.meta_value ELSE 'Y' END m_hhh, CASE b.meta_key='iii' THEN b.meta_value ELSE '0' END m_iii, CASE b.meta_key='jjj' THEN b.meta_value ELSE '0' END m_jjj FROM base AS a INNER JOIN option AS b ON a.ID = b.base_id WHERE a.type='xxx' ORDER BY a.sortnum ASC 以上、よろしくお願いいたします。 |