【发布时间】: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