電子書籍の厳選無料作品が豊富!

タイトルではうまく説明できなかったのですが、やりたいことは以下のようなことです。

まず、以下のような構成のテーブルが3つあります。


■table1

aid, a_title
1 , あああ
2 , いいい
3 , ううう
4 , えええ


■table2

bid, b_title
1 , xxxx
2 , yyyy
3 , zzzz


■table3 (table1と、table2の組み合わせ)

aid, bid
1 , 1
1 , 2
2 , 2
2 , 3
3 , 2
3 , 3
4 , 1


そして、ここから、

table1の、aid=1 のデータと、aid=1が持つ、table2の、bid=1,2 といったデータを調べたり、

table2の、bid=2 のデータと、bid=2が持つ、table1の、aid=1,2,3 といったデータを調べたいと思ってます。


これを、MySQL内で効率よく調べる方法が分かりません。
PHPとMySQLでシステムを組んでいるのですが、一度MySQL側で、

SELECT * FROM `table1`

として、それをPHP側のforループで、各aid毎に、

SELECT * FROM `table2`,`table3` WHERE table2.bid = table3.bid AND table3.aid = $aid

等とするしかないでしょうか?


あとは、テーブルを3つ使わずに、table1に、bid_list のような列を作って、そこに、"1,2"等というふうに、どのbidと関係するのかをコンマ区切りでのストリングで書いておいて、PHP側で配列にするというのも考えたのですが、この方法だと、bid=xxx を含む、table1のデータを引き出すのが困難になりそうなので、辞めようと思っています。

MySQLのバージョンは、3.23です。

A 回答 (5件)

#4です。



どちらが効率的かといえば、おそらくSQLを2回発行
するほうが効率的でしょう。
1回ですまそうとすると、無駄な文字列が繰り返し
かえってきますので、行数が増えるほど非効率です。
ただ、SQLの発行回数を少なくした方が、PHPのソースは
書きやすいと思いますので、私だったら、1回でやって
しまいますが・・・。

while($Row = mysql_fetch_array($Result,MYSQL_ASSOC)){
$title[$Row["aid"]]=$Row["a_title"];
$b_list[$Row["aid"]].=$Row["bid"].",";
}
としてケツのカンマをとればすむでしょう。

>先に、
>SELECT * FROM table1
>としてから、
>
>各行ごとに、
>SELECT * FROM table3 WHERE aid=$aid
>の結果を、配列に変換→文字列に変換するのとでは、
>どちらが効率が良いでしょうか?

これはいかがなものかと・・・。SQLをそんなに多く
発行するのは得策ではありません。

SELECT * FROM table1
をPHPで配列でとっておき
SELECT * FROM table3
の結果のaidに対比させるのが筋でしょう。
    • good
    • 0
この回答へのお礼

なるほど、詳しい説明ありがとうございました。
非常に参考になりました!

お礼日時:2005/11/23 23:01

私見ですが、PHPを使う場合は動的につなぐtableを


換えるためにINNER JOINでやった方が効率的な
スクリプトがかけるような気がします。

こんな感じでどうでしょう?

SELECT `table3`.*,`a_title`,`b_title` FROM `table3`
INNER JOIN `table1` ON `table3`.`aid`=`table1`.`aid`
INNER JOIN `table2` ON `table3`.`bid`=`table2`.`bid`

この回答への補足

#2の方の返信にも書きましたが、

○1

aid , a_title , bid_list
1 , あああ , "1,2"
2 , いいい , "1,2,3"

というような結果を得たいのですが、
一度、

SELECT `table3`.*,`a_title`,`b_title` FROM `table3`
INNER JOIN `table1` ON `table3`.`aid`=`table1`.`aid`
INNER JOIN `table2` ON `table3`.`bid`=`table2`.`bid`

といったSQLを実行して、
PHP側で、

○2

aid , a_title , bid
1 , あああ , 1
1 , あああ , 2
2 , いいい , 1
2 , いいい , 2
2 , いいい , 3

を、○1のように変換するのと、


先に、
SELECT * FROM table1
としてから、

各行ごとに、
SELECT * FROM table3 WHERE aid=$aid
の結果を、配列に変換→文字列に変換するのとでは、
どちらが効率が良いでしょうか?


文字列に変換する理由は、このデータをFLASHに送りたいからです。とりあえず、今は下に書いた方法で実装してみました。データが少ないせいもあってか、まだ遅いと感じることはないです。

補足日時:2005/11/20 13:43
    • good
    • 0

3表の結合にし、table3とtable1、table3とtable2を関連


付ければいいと思います。

select a_title,b_title
from table1,table2,table3
where table1.aid=table3.aid
and table2.bid=table3.bid

table1のaid、table2のbidを条件指定したいなら、
上記のSQLに追加してください。

#1の回答にあるビューは、MySQLではバージョン5からの
サポートです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
Viewはバージョン5からだったんですね。

お礼日時:2005/11/20 13:42

SELECT * FROM `table1`,`table2`,`table3`


WHERE table1.aid = table3.aid AND table2.bid = table3.bid
AND table3.aid = $aid
結合を2つから3つにすればいいのでは?

この回答への補足

説明が足りなかったようで申し訳ないです。

最後の行の
AND table3.aid = $aid
とありますが、

table1の行を全部いっきに取り出したいと思っていて

WHERE table1.aid = table3.aid AND table2.bid = table3.bid

という条件だと、

aid , title1 , bid , title2
1 , あああ , 1 , xxxx
1 , あああ , 2 , yyyy
2 , いいい , 1 , xxxx
2 , いいい , 2 , yyyy
2 , いいい , 3 , zzzz

といったような結果になると思いますが、

そうではなく、

1 , あああ , "1,2"
2 , いいい , "1,2,3"

というような結果を得たいと思っていました。

補足日時:2005/11/20 13:30
    • good
    • 0

はあ、どういう事がやりたいのかは大体分りましたけど、SQLの文法だけで片付く問題じゃ無いような気がします。



Viewを作って複数のテーブルの混在物を作っておくとかうまくやらないとあなたの望んでることは実現できないかな?と思いますけど。
    • good
    • 0
この回答へのお礼

迅速な回答ありがとうございました。
Viewは、バージョン3では使えないようなので、やはりPHPを介してやるしかないのかなという感じですね。

お礼日時:2005/11/20 13:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す