【问题标题】:Enumerating tables used in mysql query?枚举mysql查询中使用的表?
【发布时间】:2009-04-11 15:37:24
【问题描述】:

有没有办法枚举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',
);

【问题讨论】:

    标签: php mysql tags enumerate


    【解决方案1】:

    是的,您可以获得有关作为查询结果一部分的表和列的信息。这称为结果集元数据

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

    您必须自己通过遍历字段来构建查询中使用的不同表的数组。

    【讨论】:

    • 不错。每天学习新东西。
    【解决方案2】:

    根据您使用它的目的,MySQL 的 EXPLAIN 可以为您解决问题:

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

    【讨论】:

      【解决方案3】:

      标记为好的解决方案将只返回结果表。但是,如果您执行下一个查询,它将失败:

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

      只返回用户,而不是猫和狗表。

      最好的解决方案是找到一个好的解析器,另一个解决方案是使用 REGEX 和 EXPLAIN 查询(​​更多信息在下一个链接中):

      Get mysql tables in a query

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

      编辑:搜索表格时,最好使用 preg,例如:

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

      如果不是,它可能会返回误报,例如“table_name2”、“table_name3”... table_name 将返回 FOUND 两次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        • 1970-01-01
        • 1970-01-01
        • 2016-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多