- PR -

MySQLでの多重テーブル結合について

投稿者投稿内容
ブーレイ
会議室デビュー日: 2007/03/15
投稿数: 9
投稿日時: 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の情報を関連取得したいという事です。

以上、宜しくお願いいたします。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2008-07-18 05:43
SQLだけ示して、表の列構成や関連は、アドバイスしようとする人に読み解いて
ということですか?

表の列構成、表と表の関連、データ例くらいは、最低限、示しましょう。

引用:

もっと簡潔で早く処理できるようにすることは出来ますでしょうか?



母体データ件数はどのくらいあり、検索対象データはそのうちどのくらいで、どういう
インデクスを定義済ですか?
未記入
会議室デビュー日: 2006/11/10
投稿数: 12
投稿日時: 2008-07-18 09:17
簡潔もなにも
なんでoptionをずらずらと結合してるのか理解できないや

普通にひとつ結合して
caseあたりでmeta_keyを見てm_bbbを出す出さないを判断すればいいんでは?

case
when meta_key = 'ccc' then meta_value
end m_ccc
・・・以下つづく


みたいな感じで
ブーレイ
会議室デビュー日: 2007/03/15
投稿数: 9
投稿日時: 2008-07-18 14:10
忠犬さま、
ベーステーブルは100件、オプションテーブルは1200件くらいです。
ベーステーブル
 ID、フィールド1、フィールド2、フィールド3…フィールド20

オプションテーブル(ベース1件につき、10〜20件くらい付加されます)
 オプションID、ベースID、メタキー、メタバリュー

の様な感じです。

ずらずらと並べていたのは、caseを使ったSQLがなかなか通らなくて、単純に結合して書けば普通に5つくらいまでは結合しても実行できたから書きました。


以上、よろしくお願いいたします。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2008-07-18 15:03
SQL一発でやるんなら、それでいいんじゃないでしょうか。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-07-18 15:41
引用:

ブーレイさんの書き込み (2008-07-18 14:10) より:
ずらずらと並べていたのは、caseを使ったSQLがなかなか通らなくて、



では、そのcaseを使ったSQLを提示してみてはどうでしょうか?
「もっと簡潔で早く処理できるように」ですよね?CASEが良いと思います。
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 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 ]
ブーレイ
会議室デビュー日: 2007/03/15
投稿数: 9
投稿日時: 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

以上、よろしくお願いいたします。

スキルアップ/キャリアアップ(JOB@IT)