2009-04-11 6 views
2

Gibt es eine Möglichkeit, Tabellen in MySQL-Abfrage aufzulisten?Auflisten von Tabellen in MySQL-Abfrage verwendet?

Können sagen, ich Abfrage haben:

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 

Und ich möchte im Gegenzug Array:

$tables = array(
[0] => 'db_people.people_facts', 
[1] => 'db_system.connections', 
[2] => 'db_people.people', 
); 

Antwort

0

Die als gut markierte Lösung gibt nur die Ergebnistabellen zurück. Aber wenn Sie die nächste Abfrage tun wird es scheitern:

SELECT users.* FROM users, cats, dogs WHERE users.id = cats.user_id 

Will Rückkehr nur Benutzer und nicht die Katzen und Hunde Tabellen.

Die beste Lösung ist eine gute Parser finden, ist eine andere Lösung REGEX mit und EXPLAIN Abfrage (weitere Informationen im nächsten Link):

Get mysql tables in a query

Aber ich denke, dass eine andere gute Lösung ist Liste alle Tabellen und suchen sie in der Abfrage, können Sie die Liste der Tabellen zwischenspeichern.

EDIT: Wenn für Tabellen suchen, verwenden Sie besser eine Preg wie:

// (`|'|"|)table_name(\1|$) 
if(preg_match('/(`|\'|"|)table_name(\1|$)/i', $query)) 
    // found 

Wenn nicht, es mit falschen Positiven zum Beispiel "Tabellenname2", "table_name3" zurückkehren kann ... table_name zurückkehren GEFUNDEN zwei mal.

4

Ja, können Sie Informationen über Tabellen erhalten und Spalten, die Teil eines Abfrageergebnisses sind. Dies wird Resultset Metadaten genannt.

Die einzige PHP-Lösung für MySQL-Resultset-Metadaten ist die Verwendung der MySQLi-Erweiterung und der mysqli_stmt::result_metadata()-Funktion.

$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"; 

Sie müssen das Array der verschiedenen Tabellen, die in der Abfrage verwendet werden, selbst erstellen, indem Sie die Felder durchlaufen.

+0

Schön. Lerne jeden Tag etwas Neues. –