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',
);
War es hilfreich?

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:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top