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',
);
Foi útil?

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 , 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ê:

http://dev.mysql.com/doc/refman /5.0/en/explain.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top