Aufzählen von Tabellen in MySQL-Abfrage verwendet?
Frage
Gibt es eine Möglichkeit Tabellen in MySQL-Abfrage verwendet aufzuzählen?
Lets sagen, ich habe Abfrage:
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',
);
Lösung
Die Lösung markiert so gut zurück nur auf die Ergebnistabellen. Aber wenn Sie die nächste Abfrage tun wird es fehlschlagen:
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 einen guten Parser zu finden, ist ein andere Lösung mit REGEX und EXPLAIN Abfrage (weitere Informationen im nächsten Link):
Get MySQL-Tabellen in einer Abfrage
Aber ich denke, dass eine andere gute Lösung ist Liste alle Tabellen und sie in der Abfrage suchen können Sie die Liste der Tabellen-Cache.
Bearbeiten : 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, kann es Fehlalarme Rückkehr mit zum Beispiel „Tabellenname2“, „table_name3“ ... table_name werden zweimal ergibt.
Andere Tipps
Ja, können Sie Informationen über Tabellen und Spalten erhalten, die Teil eines Abfrageergebnisses sind. Dies nennt man führen gesetzt Metadaten .
Die einzige PHP-Lösung für MySQL Ergebnismenge Metadaten ist die MySQLi Erweiterung zu verwenden und die 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 finden das Array von verschiedenen Tabellen in der Abfrage verwendet bauen selbst, indem über die Felder Looping.
Je nachdem, was Sie verwenden es für, MySQL erklären könnte den Trick für Sie tun: