mysqldump具有--where选项,可为给定表执行WHERE子句。
尽管无法mysqldump联接查询,但是您可以从每个表中导出特定的行,以便以后从联接中涉及从每个表中提取的每一行。
对于给定的查询,您将需要mysqldump三次:
首先,mysqld转储名称为('fee','fi','fo','fum')的所有table3行:
mysqldump -u... -p... --where="name in ('fee','fi','fo','fum')" mydb table3 > table3.sql
接下来,mysqldump从第一个mysqldump中获取具有匹配table3_id值的所有table2行:
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
然后,mysqldump从第二个mysqldump转储具有匹配table1_id值的所有table1行:
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
注意:由于第二个和第三个mysqldumps需要使用多个表,因此必须使用--lock-all-tables。
创建新数据库:
mysqladmin -u... -p... mysqladmin create newdb
最后,将三个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');
试试看 !!!
警告:如果索引不正确,第二个和第三个mysqldumps可能会永远占用!!!
以防万一,请索引以下各列:
ALTER TABLE table2 ADD INDEX (table1_id);
ALTER TABLE table2 ADD INDEX (table3_id);
ALTER TABLE table3 ADD INDEX (name,id);
我假设id是table3的主键。