MySQL(に限りませんが)で2つのテーブルにて、1つのテーブルに複数の行にわたり保存されており、それを一方のテーブルの行に結合させようとしたい場合の方法。文章で書くと自分でもわかり難いので、表をまじえて説明。
TableA
number_A | text_A |
---|---|
1 | いぬ |
1 | ねこ |
2 | ねこ |
3 | いぬ |
3 | さる |
TableB
number | name |
---|---|
1 | あつこ |
2 | ゆうこ |
3 | まりこ |
上の2つのテーブルから、下のテーブルとして出力させたい!
TableAのnumber_AとTableBのnumberが紐付け。
TableOutput
number | name | animal_01 | animal_02 | animal_03 |
---|---|---|---|---|
1 | あつこ | いぬ | ねこ | NULL |
2 | ゆうこ | ねこ | NULL | NULL |
3 | まりこ | いぬ | さる | NULL |
PHPで上記の表を得たい場合は、以下のように実施する。
// 動物名は3つまで表示 for( $i = 0; $i < 3; $i++ ){ $sqlAnimal = 'SELECT `number_A`, `text_A` AS `animal_0'.$i.'` FROM `TableA` WHERE `number_A` = '.$i.';'; $joinSql .= 'LEFT JOIN ( '.$sqlAnimal.' ) AS `animalTable'.$i.'` '; $joinSql .= 'ON `TableB`.`number` = `animalTable'.$i.'`.`number_A`'; } // 結合 $sql = 'SELECT '; $sql .= '`TableB`.*, '; $sql .= '`animalTable0`.`animal_00`, '; $sql .= '`animalTable1`.`animal_01`, '; $sql .= '`animalTable2`.`animal_02` '; $sql .= 'FROM `TableB` '.$joinSql.';';
あとはSQLを実行すればOK。
たまにわからなくなることがあるため、ここに備忘録として記録。