SQLのテーブルのjoinについて


テーブルは以下とします。
t_contents
id,user_id,category_id,picture_id

t_user
id,name

t_category
id,name

t_picture
id,name

ここで、以下の情報がほしいとします。
SELECT
co.id,
u.name as user_name,
ca.name as category_name,
p.name as picture_name
FROM
t_contents co,
t_user u,
t_category ca
t_picture p
WHERE
co.user_id = u.id
AND co.category_id = ca.id
AND co.picture_id = p.id

以上のようなSQLを使っているのですが、これ以上に項目が20くらいあった場合、joinするテーブルが20になるのは、とても処理コストがかかってしまうような気がしています。

以上のようなSQLをより適切に書くとどうなるのでしょうか?

なおMYSQL4を使用しているため、サブクエリが使用できません。

回答の条件
  • 1人2回まで
  • 登録:2007/05/22 15:45:42
  • 終了:2007/05/29 15:50:03

回答(3件)

id:memo77 No.1

memo77回答回数238ベストアンサー獲得回数202007/05/22 17:48:47

ポイント27pt

当然結合するテーブルが多くなればコストがかかるのはあたりまえですが、

「必要以上に」ということでしょうか。

結合させる側(今回で言えばt_contents以外のテーブル)がprimary keyで

結合されているならそれ以上にコストを下げることはできないと思います。

私ならこうでしょうか。


SELECT

co.id,

u.name as user_name,

ca.name as category_name,

p.name as picture_name

FROM t_contents co

INNER JOIN t_user u

ON co.user_id = u.id

INNER JOIN t_category ca

ON co.category_id = ca.id

INNER JOIN t_user t_picture p

ON co.picture_id = p.id

id:dingding

ありがとうございます。

なるほど、こういう書き方もあるんですね。

2007/05/22 21:44:52
id:Yota No.2

Yota回答回数453ベストアンサー獲得回数282007/05/23 09:28:15

ポイント27pt

t_contents

id,user_id,category_id,picture_id

t_user

id,name

t_category

id,name

t_picture

id,name

下の3テーブル(マスタ)が更新されない。追加されるのみである。と言う前提で非正規化すればいいと思います。

t_contents

id,user_id,user_name,category_id,category_name,picture_id,picture_name

でも、いまどきのDBMSならINDEXを適切に設定しさえすれば20や30の結合はどうということはない気がします。

id:dingding

そうなんでしたか。

あまり結合してはいけないとばかり考えてました。

ありがとうございます。

2007/05/23 11:25:37
id:Yota No.3

Yota回答回数453ベストアンサー獲得回数282007/05/23 15:40:29

ポイント26pt

すいません。

いまどきのDBMSならINDEXを適切に設定しさえすれば20や30の結合はどうということはない気がします。

と書いたものの、実際には結合テーブルの数だけでなく各テーブルのレコード数に依存するので一気に増やさないで確認しながらやってください。

それと上の人と重なりますが標準SQLでは、

t_contents

id,user_id,category_id,picture_id

t_user

user_id,name

というふうに、カラムの名前を同一にしておけば、

ON t_contents.user_id = t_user.t_user_id

のところを

USING('user_id') ;

とすっきりかけるので、検討してみて下され。

MySQL4で使えるかどうかはわかりません。

参考

http://dev.mysql.com/doc/refman/4.1/ja/join.html

id:dingding

USING初めて知りました。

すっきりしますね。

しかし今は、カラム名は同じでないですね。

参考になります。ありがとうございます。

2007/05/24 17:56:59

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません