有没有办法在查询中使表名动态化?

时间:2010-09-29 18:31:01

标签: php mysql

我正在尝试为产品创建一个Class-Inheritance设计。

基表包含所有常用字段。然后,对于每种产品类型,都有一个单独的表,其中包含仅适用于该产品类型的字段

因此,为了获得产品的所有数据,我需要JOIN基表与任何与基表中列出的product_type相关的表。有没有办法动态地在表上进行此查询连接?

这是一个试图说明我想要做的事情的查询:

SELECT * FROM product_base b
INNER JOIN <value of b.product_type> t
    ON b.product_base_id = t.product_base_id 
WHERE b.product_base_id = :base_id

有办法做到这一点吗?

4 个答案:

答案 0 :(得分:9)

不,没有办法做到这一点。解析查询时必须知道表名,因此解析器可以判断表是否存在,并且它包含您引用的列。此外,优化器需要知道表及其索引,因此它可以提出要使用的索引的计划。

您要求的是根据逐行找到的数据在执行期间确定表。 RDBMS无法在分析时知道所有数据值对应于真实表。

你没有理由这样做来实现Class Table Inheritance。 CTI支持表之间的真正引用。

您正在描述多态关联的antipattern

答案 1 :(得分:1)

进行2次查询:
首先选择&lt; b.product_type的值&gt;然后在第二个中使用它(你拥有的那个,但用第一个的结果替换&lt; b.product_type&gt;的值)。

答案 2 :(得分:0)

没有。即使有可能也没有什么意义,因为查询优化器无法在不了解连接右侧的情况下制定计划。

您需要使用串联或类似方法构造查询,但请确保仅使用有效的表名来避免注入攻击。

答案 3 :(得分:0)

您可以创建一个以表名作为参数的过程,并构造一个动态SQL查询。但是在服务器端代码(PHP)中执行此操作可能更容易。但是,不是将其变为变量(并且建议易受注入攻击),而是为不同的连接组合创建单独的类。使用另一个类(如调度程序)来确定要实例化的正确类。