![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
タイトルではうまく説明できなかったのですが、やりたいことは以下のようなことです。
まず、以下のような構成のテーブルが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です。
No.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に対比させるのが筋でしょう。
No.4
- 回答日時:
私見ですが、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に送りたいからです。とりあえず、今は下に書いた方法で実装してみました。データが少ないせいもあってか、まだ遅いと感じることはないです。
No.3
- 回答日時:
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からの
サポートです。
No.2
- 回答日時:
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"
というような結果を得たいと思っていました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- カスタマイズ(車) 2003年式レガシィB4 2.0GT TA-BL5に乗ってるのですが このマイルドダンパーという車高 2 2023/06/11 22:09
- その他(趣味・アウトドア・車) BLが好きだと決めつけられます。 1 2022/04/24 10:25
- その他(アニメ・マンガ・特撮) 腐女子ってマナーが悪いですよね? 2 2023/04/10 17:56
- バイク車検・修理・メンテナンス ジャイロキャノピーta-02のマフラー詰まり改善方法。 マフラーが詰まっています。 取り外さずに詰ま 2 2023/02/06 20:29
- その他(アニメ・マンガ・特撮) 腐女子とBL、ゲイについて。 27歳男、ゲイです。 私は腐女子が大嫌いです。腐女子という言葉なんて無 8 2023/08/24 03:03
- その他(プログラミング・Web制作) x86_32のGASの擬似命令 3 2023/06/07 19:55
- その他(悩み相談・人生相談) 客観的に見て私の適職・天職は何ですか? ①過去に夢中になったものは何か? 絵(幼稚園から今もずっと) 5 2022/07/14 16:36
- 工学 ちなみになぜv=(v・e1)e1+(v・e2)e2はe1やe2が、正規直交基底でないと成り立たないと 2 2022/12/22 17:22
- 恋愛・コメディ おすすめの映画を教えて欲しいです なんていうジャンルといえばいいのかわからないんですが、(BL映画な 6 2022/06/03 00:22
- その他(アニメ・マンガ・特撮) BL好き&オタクが結構私の周りにいて、「お前、腐女子?」っていちいち聞いてくるのが嫌です。私はどっち 1 2022/09/14 09:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INSERT文でフィールドの1つだ...
-
Unionの結果全体をOrder By し...
-
count集計の結果が0の場合でも...
-
SQLでフィールドの順番を変更し...
-
SQLについて教えて下さい with(...
-
SQL server改行コード
-
「重複を間引いた数」をcountし...
-
1、Rstudioで回帰直線を求める...
-
差し込み後、元データを変更し...
-
SQLで特定の項目の重複のみを排...
-
フィルターかけた後、重複を除...
-
外部参照してるキーを主キーに...
-
for whichの使い方
-
エクセルで最後の文字だけ置き...
-
速度が低下し無効になったアド...
-
SELECT 文 GROUP での1件目を...
-
カーソル0件の時にエラーを発生...
-
SQLにて特定の文字を除いた検索...
-
sqlで、600行あるテーブルを100...
-
Unionした最後にGROUP BYを追加...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INSERT文でフィールドの1つだ...
-
count集計の結果が0の場合でも...
-
SQLでフィールドの順番を変更し...
-
Unionの結果全体をOrder By し...
-
SQLについて教えて下さい with(...
-
グループ毎の最大値を持つデー...
-
'internal' のシステム メモリ...
-
SQLServerでの切り上げ処理
-
MySQLで複数のSELECT文を1文に...
-
SQLでの計算結果がおかしい
-
JOINで1つのテーブルに空白があ...
-
SQL server改行コード
-
「重複を間引いた数」をcountし...
-
SQL Server 2005 Express で CD...
-
自作関数の方がパフォーマンス...
-
SQLの条件文
-
DB2でのロック
-
複数テーブルからデータを取り...
-
SQLについて教えてください(最...
-
結合? コピー? 初歩的な質...
おすすめ情報