Enumerando tabelas usadas na consulta de mysql?
Pergunta
Existe alguma maneira para enumerar as tabelas usadas na consulta de mysql?
Vamos dizer que eu tenho consulta:
SELECT * FROM db_people.people_facts pf
INNER JOIN db_system.connections sm ON sm.source_id = pf.object_id
INNER JOIN db_people.people p ON sm.target_id = p.object_id
ORDER BY pf.object_id DESC
E eu quero em ordem de retorno:
$tables = array(
[0] => 'db_people.people_facts',
[1] => 'db_system.connections',
[2] => 'db_people.people',
);
Solução
A solução marcado como boa irá retornar apenas as tabelas de resultados. Mas se você fizer a próxima consulta irá falhar:
SELECT users.* FROM users, cats, dogs WHERE users.id = cats.user_id
retorno somente os usuários e não gatos e cães tabelas.
A melhor solução é encontrar um bom analisador, outra solução é usar REGEX e explicar consulta (mais informações no próximo link):
ter o MySQL tabelas em uma consulta
Mas eu acho que uma outra solução boa é lista de todas as tabelas e procurá-los dentro da consulta ??em> , você pode armazenar em cache a lista de tabelas.
Editar : Ao procurar por mesas, melhor usar um preg como:
// (`|'|"| )table_name(\1|$)
if(preg_match('/(`|\'|"| )table_name(\1|$)/i', $query))
// found
Se não, ele pode retornar falsos positivos com, por exemplo, "table_name2", "table_name3" ... table_name voltará encontrou duas vezes.
Outras dicas
Sim, você pode obter informações sobre tabelas e colunas que fazem parte de um resultado de consulta. Isso é chamado resultado conjunto de metadados .
A solução PHP apenas para metadados MySQL conjunto de resultados é usar a extensão MySQLi e mysqli_stmt::result_metadata()
função.
$stmt = $mysqli->prepare("SELECT * FROM db_people.people_facts pf
INNER JOIN db_system.connections sm ON sm.source_id = pf.object_id
INNER JOIN db_people.people p ON sm.target_id = p.object_id
ORDER BY pf.object_id DESC");
$meta = $stmt->result_metadata();
$field1 = $meta->fetch_field();
echo "Table for field " . $field1->name . " is " . $field1->table . "\n";
Você vai ter que construir a matriz de tabelas distintas usadas na consulta-se, por looping sobre os campos.
Dependendo do que você está usando para isso, MySQL do EXPLICAR poderia fazer o truque para você: