fundo
Gostaria de fornecer o subconjunto do meu banco de dados necessário para reproduzir uma select
consulta. Meu objetivo é tornar reprodutível meu fluxo de trabalho computacional (como na pesquisa reproduzível ).
Questão
Existe uma maneira de incorporar essa instrução select em um script que despeja os dados consultados em um novo banco de dados, de modo que o banco de dados possa ser instalado em um novo servidor mysql e a instrução funcione com o novo banco de dados. O novo banco de dados não deve conter registros além daqueles que foram usados na consulta.
Atualização: para esclarecimento, não estou interessado em um dump csv dos resultados da consulta. O que eu preciso fazer é despejar o subconjunto do banco de dados para que ele possa ser instalado em outra máquina e, em seguida, a própria consulta pode ser reproduzível (e modificável em relação ao mesmo conjunto de dados).
Exemplo
Por exemplo, minha análise pode consultar um subconjunto de dados que requer registros de várias tabelas (neste exemplo 3):
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');
Respostas:
O mysqldump possui a opção --where para executar uma cláusula WHERE para uma determinada tabela.
Embora não seja possível mysqldump uma consulta de junção, você pode exportar linhas específicas de cada tabela para que todas as linhas buscadas em cada tabela sejam envolvidas na junção posteriormente.
Para sua consulta, você precisaria mysqldump três vezes:
Primeiro, o mysqldump todas as linhas da table3 com o nome in ('fee', 'fi', 'fo', 'fum'):
Em seguida, o mysqldump todas as linhas da tabela2 que possuem valores correspondentes de table3_id do primeiro mysqldump:
Então, mysqldump todas as linhas da tabela1 que possuem valores correspondentes table1_id do segundo mysqldump:
Nota: Como o segundo e o terceiro mysqldumps requerem o uso de mais de uma tabela, --lock-all-tables deve ser usado .
Crie seu novo banco de dados:
Finalmente, carregue os três mysqldumps em outro banco de dados e tente a junção no novo banco de dados.
No cliente mysql, execute sua consulta de junção
De uma chance !!!
AVISO: Se não estiver indexado corretamente, o segundo e o terceiro mysqldumps podem levar uma eternidade !!!
Apenas no caso, indexe as seguintes colunas:
Vou assumir que id é a chave primária da tabela3.
fonte
--where
cláusula na documentação; informará como isso funciona depois que eu tiver a chance de experimentar.Eu consideraria usar um 'outfile' como parte do seu SELECT em vez do mysqldump para resolver esse problema. Você pode produzir qualquer instrução SELECT desejada e anexar "INTO OUTFILE '/path/to/outfile.csv' ..." no final com a configuração apropriada para a saída no estilo CSV. Em seguida, você pode simplesmente usar algo como a sintaxe ' LOAD DATA INFILE ...' para carregar os dados em seu novo local do esquema.
Por exemplo, usando seu SQL:
Lembre-se de que você precisará de espaço de armazenamento disponível suficiente na partição do disco de destino.
fonte
Load Data Infile
para carregar esse .csv nesse novo banco de dados. Agora, a consulta pode ser executada.O utilitário mysqldump possui uma opção --tables que permite especificar quais tabelas despejar. Permite especificar a lista de tabelas.
Não conheço nenhuma maneira mais fácil (automatizada).
fonte
delete from table1 where id not in (.....);
, se essa for a maneira mais fácil, desde que o script possa ser automatizado, não é necessário que a ferramenta específica exista.O que foi útil para mim foi algo como:
De http://krosinski.blogspot.com/2012/12/using-table-join-with-mysqldump.html
fonte
Você já tentou a função quote no mysql?
salve o acima, como query.sql
fonte
No MySQL:
Na linha de comando:
No servidor de destino, configure ~ / .my.cnf
Importar no servidor de destino
fonte
eu escrevi um pequeno script para um problema semelhante, aqui está: https://github.com/digitalist/mysql_slice
ou seja, você tem esta consulta :
você recebeu esse despejo :
fonte