質問

mysqlクエリで使用されるテーブルを列挙する方法はありますか?

クエリがあるとしましょう:

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

そして、戻り配列が必要です:

$tables = array(
[0] => 'db_people.people_facts',
[1] => 'db_system.connections',
[2] => 'db_people.people',
);
役に立ちましたか?

解決

良いとマークされたソリューションは、結果表を返します。しかし、あなたは、次のクエリを実行する場合、それは失敗します。

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

ユーザーのみのではなく猫と犬のテーブルを返します。

最善の解決策は、別の解決策はREGEXを使用している、良いパーサを見つけて、クエリ(次のリンクで詳細を)EXPLAINされます:

取得mysqlのクエリでのテーブル

しかし、私は別の良い解決策がある[ のリストのすべてのテーブルであることを考えると、クエリ内でそれらを検索するを、あなたがテーブルのリストをキャッシュすることができます。

編集:テーブルを検索する場合、より良いようにプリプレグを使用します:

// (`|'|"| )table_name(\1|$)
if(preg_match('/(`|\'|"| )table_name(\1|$)/i', $query))
    // found
ない場合は、

、それは例えばで偽陽性を返すことができます "table_name2"、 "table_name3" ... table_nameがFOUND 2回を返します。

他のヒント

はい、クエリ結果の一部であるテーブルと列に関する情報を取得できます。これはと呼ばれます 結果セットのメタデータ.

MySQL 結果セットのメタデータに対する唯一の PHP ソリューションは、MySQLi 拡張機能と mysqli_stmt::result_metadata() 関数。

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

フィールドをループして、クエリで使用される個別のテーブルの配列を自分で構築する必要があります。

に応じて、あなたはあなたのためのトリックを行うことができEXPLAIN MySQLの、のためにそれを使用しているもの:

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top