有没有办法枚举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

威尔的仅返回用户并没有猫狗表。

最好的解决方法是找到一个很好的解析器,另一种解决方案是使用正则表达式和(在下一链路的详细信息)解释查询:

在查询

获得MySQL表

但我认为,另一个好的解决方案是 列表中的所有表和搜索他们的查询中上,您可以缓存表的列表。

修改:当对表进行搜索,更好使用预浸料,如:

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

如果不是,它可以返回误报例如“table_name2”,“table_name3” ... table_name的将返回找到两次。

其他提示

是的,您可以获得有关查询结果中的表和列的信息。这就是所谓的 结果集元数据.

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

您必须通过循环字段来自行构建查询中使用的不同表的数组。

根据你使用它,MySQL的解释什么能为你做的伎俩:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top