質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

2492閲覧

PHPにてMYsqlの2つのテーブルの内部結合を行いたい。

uep3vjz9wp

総合スコア20

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/08/05 13:52

編集2018/08/05 13:54

お世話になっております。

PHPにてMYsqlの2つのテーブルの内部結合を行いたい。

table1のbangou1とtable2のbangouは以下で結合できます。

php

1$sql = "SELECT * FROM table1 JOIN table2 ON table1.bangou1 = table2.bangou";

ここからさらに、
table1のbangou2とtable2のbangouも結合したいのですが、できません。何か良い方法はないものでしょうか。

 要するに、
table1のbangou1
table1のbangou2
上記2つに
table2のbangouをそれぞれに入れたいのです。

 ブラウザ表示例

bangou1 | bangou | bangou2 | bangou |

 15 | 15 | 32 | 32 |

ご教示お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/08/05 22:59

タグにMySQLを追加し、質問本文にPHP,MySQLのバージョンも追記してください。(できれば質問タイトル・本文の表記も[MySQL]と調整していただきたく)
guest

回答3

0

ベストアンサー

select * だとbangouなどが被っちゃうので、エイリアス付けないと参照時にエラーになりそうです。

SQL

1SELECT t1.bangou1, t2.bangou as ref1_bangou, t1.bangou2, t3.bangou as ref2_bangou 2FROM table1 as t1 3 left JOIN table2 as t2 4 ON table1.bangou1 = table2.bangou 5 left JOIN table2 as t3 6 ON table1.bangou2 = table3.bangou

内部結合と言われているけど、外部結合じゃないのか気になるので、取り敢えず外部結合で記述。

投稿2018/08/05 15:32

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uep3vjz9wp

2018/08/06 12:33

ありがとうございました。もう一度よく本などを読み直しました。外部結合ですね。
guest

0

bangouの数だけjoinを繰り返してもいいですが、joinは1回だけにしてorで処理するという考え方もあります

SQL

1create table tbl1 (id int primary key,no1 int,no2 int); 2insert into tbl1 values 3(1,1,11),(2,2,12),(3,1,2); 4 5create table tbl2 (no int primary key); 6insert into tbl2 values 7(1),(2),(11),(12); 8 9select t1.id 10,max(t1.no1) as no_1_1 11,sum((t1.no1=t2.no)*t2.no) as no_1_2 12,max(t1.no2) as no_2_1 13,sum((t1.no2=t2.no)*t2.no) as no_2_2 14from tbl1 as t1 15inner join tbl2 as t2 16on t1.no1=t2.no or t1.no2=t2.no 17group by id

投稿2018/08/06 01:09

yambejp

総合スコア114583

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/08/06 03:41

おっ!と思いましたが、group byするコストに見合うかどうか疑問ですね。
yambejp

2018/08/06 03:45 編集

joinの回数がすくなければjoinしたほうが早いと思いますよ joinがかさんでくると今回の方法が効率があがってきます (なにせ1回しかjoinしないので) ただ元の命題が同じ属性のデータをカラムを分けて管理していることが 非効率な原因なので、チューニングするなら元のテーブル構造を見直します
sazi

2018/08/06 03:56

へー、joinの回数がそんなに影響するとは。 極端な話をすれば複数のマスタを一つに集約して、orでjoinして集約するのが高速ってことなんですね。 でも、可読性も落ちるしあまりやりたくはないなぁ
guest

0

別名を付ければ可能です。
つ$sql = "SELECT * FROM table1 t1 JOIN table2 t2 ON t1.bangou1 = t2.bangou JOIN table2 t3 ON t1.bangou2 = t3.bangou";

投稿2018/08/05 14:41

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uep3vjz9wp

2018/08/05 15:12 編集

お忙しいところありがとうございます。 FROM table1をFROM table1 t1 と言ったようにそのまま書き換えるということでしょうか。 以下は私のコードとアドバイス頂いたコードを並べてみました。 ---php $sql = "SELECT * FROM table1 JOIN table2 ON table1.bangou1 = table2.bangou"; $sql = "SELECT * FROM table1 t1 JOIN table2 t2 ON t1.bangou1 = t2.bangou JOIN table2 t3 ON t1.bangou2 = t3.bangou"; --- つまりアドバイス頂いたコードをそのまま使って動作しないものですからなんらかの書き換えが必要ということでよいでしょうか。  大変恐縮ですがご教示お願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問