mysqldumpには、特定のテーブルに対してWHERE句を実行する--whereオプションがあります。
結合クエリをmysqldumpすることはできませんが、各テーブルからフェッチされたすべての行が後で結合に関与するように、各テーブルから特定の行をエクスポートできます。
指定したクエリに対して、mysqldumpを3回実行する必要があります。
最初に、名前が( 'fee'、 'fi'、 'fo'、 'fum')のすべてのtable3行をmysqldumpします。
mysqldump -u... -p... --where="name in ('fee','fi','fo','fum')" mydb table3 > table3.sql
次に、最初のmysqldumpのtable3_id値が一致するすべてのtable2行をmysqldumpします。
mysqldump -u... -p... --lock-all-tables --where="table3_id in (select id from table3 where name in ('fee','fi','fo','fum'))" mydb table2 > table2.sql
次に、2番目のmysqldumpから一致するtable1_id値を持つすべてのtable1行をmysqldumpします。
mysqldump -u... -p... --lock-all-tables --where="id in (select table1_id from table2 where table3_id in (select id from table3 where name in ('fee','fi','fo','fum')))" mydb table1 > table1.sql
注:2番目と3番目のmysqldumpでは複数のテーブルを使用する必要があるため、--lock-all-tablesを使用する必要があります。
新しいデータベースを作成します。
mysqladmin -u... -p... mysqladmin create newdb
最後に、3つのmysqldumpsを別のデータベースにロードし、新しいデータベースでそこで結合を試みます。
mysql -u... -p... -D newdb < table1.sql
mysql -u... -p... -D newdb < table2.sql
mysql -u... -p... -D newdb < table3.sql
mysqlクライアントで、結合クエリを実行します
mysql> use newdb
mysql> select table1.id, table1.level, table2.name, table2.level
from table1 join table2 on table1.id = table2.table1_id
join table3 on table3.id = table2.table3_id
where table3.name in ('fee', 'fi', 'fo', 'fum');
試してみる !!!
警告:正しくインデックス付けされていない場合、2番目と3番目のmysqldumpが永遠にかかることがあります!!!
念のため、次の列にインデックスを付けます。
ALTER TABLE table2 ADD INDEX (table1_id);
ALTER TABLE table2 ADD INDEX (table3_id);
ALTER TABLE table3 ADD INDEX (name,id);
idはtable3の主キーであると仮定します。