MySQLの列を行にして結合をPHPで


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。
たまにわからなくなることがあるため、ここに備忘録として記録。