【问题标题】:How to make EXPLAIN SELECT statements return the original table names instead of their aliases?如何使 EXPLAIN SELECT 语句返回原始表名而不是它们的别名?
【发布时间】:2023-01-07 01:35:29
【问题描述】:

我有一个这种格式的 SQL 查询:

SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id;

我想,对于任何预先未知的给定 SQL SELECT 查询,我想知道哪些表用于运行它。所以我想我会为此使用 EXPLAIN SELECT 语句。

我的问题是 EXPLAIN SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id; 查询返回“t1”和“t2”作为表名。我需要它给我原始表名,分别是 table1 和 table2。现在,我明白这是不可能的according to this old report

但是,我需要以某种方式完成这项工作。我真的不想在查询上运行一些 REGEX(除非你有一个想法,这无疑将包括如何在查询中使用表的所有场景,无论它是多么不标准化)。

我已经准备好听到您可能想到的所有可能性,它不必使用 EXPLAIN SELECT,只要我可以获得在未知 SELECT 查询中使用的所有原始表名即可。我不关心 EXPLAIN SELECT 提供的其余信息,我只需要表名。

如果您想提出一个超出 MySQL 范围的解决方案,我使用 PHP 作为主要平台来使用 PDO 执行这些请求(但是,查询是直接执行的,它们是不是准备好的陈述)。

【问题讨论】:

  • 这是在存在自连接的情况下完成的,因此您可以知道它引用的是表的哪个实例。我认为没有任何方法可以自定义输出。
  • 您可以去掉查询中的别名。
  • @Barmar 这当然是一个选项,但如果我事先不知道查询,我该怎么做?事实上,我什至不知道是否可以找到别名。只要它之后仍然有效,我就完全可以摆脱查询中的别名
  • github.com/greenlion/PHP-SQL-Parser 但是一旦你开始解析 sql 你就会遇到问题,因为 msyql 开始支持你的解析器不支持的新东西
  • 你为什么要解释一个你事先不知道的查询?你打算如何处理结果?

标签: php mysql select pdo explain


【解决方案1】:

您要求的内容可能会变得非常复杂,因为 SQL 中的表引用可以是 viewcommon table expressionderived table subquery

其中任何一个都可能是多个表的JOIN,或多个查询的UNION/INTERSECT/EXCEPT

它甚至可以有如果它是一个选择元组或VALUES statement 的子查询,则根本没有基表。

我不认为有一种方法可以用正则表达式做你想做的事情,除非你对一个非常减少的 SQL 查询子集感到满意。您需要一个成熟的 SQL 解析器来跟踪每个表引用的基表。

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2011-08-01
    • 1970-01-01
    • 2014-01-18
    相关资源
    最近更新 更多