我有一个如下格式的SQL查询:
第一个月
对于任何给定的未知的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执行这些请求(但是,查询是直接执行的,它们不是预准备语句)。
1条答案
按热度按时间ffx8fchx1#
您所请求的内容可能会非常复杂,因为SQL中的表引用可以是view、common table expression或derived table subquery。
其中任何一个都可以是多个表的
JOIN
,或者是多个查询的UNION
/INTERSECT
/EXCEPT
。如果它是一个选择元组或
VALUES
statement的子查询,它甚至可以根本没有基表。我不认为有一种方法可以用正则表达式做你想做的事情,除非你对SQL查询的一个非常小的子集感到满意。你需要一个成熟的SQL解析器来跟踪每个表引用的基表。