从SQL查询中选择要加入的表名

时间:2015-03-13 12:10:45

标签: php mysql sql

在当前的数据库设计中,我有一个名为" Leads"和其他一些以product_(product_life_insurance,product_medical_insurance,...)开头的表格

-Leads Table :
--ID
--Product
...

-Product_Life_insurance Table :
--ID
--LeadID
...

领先行:

ID 5
Product: life_insurance

product_life_insurance行:

ID 1
LeadId 5

...

无论如何都要创建一个查询来从Leads中选择表名并添加" product _"它的前缀,然后将其加入产品表?

我的意思是:

SELECT *
FROM `leads` JOIN `product_life_insurance` ON `leads`.`id` = `product_life_insurance`.`leadID`
WHERE `leads`.`id` = '5';

我想从leads表中选择要加入的表名,然后添加" product _"它的前缀并在我的查询中使用它。

谢谢:)

1 个答案:

答案 0 :(得分:1)

你问:

  

有没有办法创建一个查询来从Leads中选择表名   添加"产品_"它的前缀,然后将其加入产品表?

答案是。在纯SQL中,您无法创建表名变量,然后在查询中使用它们。当然,您可以在主机php代码中执行此操作。但是您需要使用一个查询来获取表名,并使用更多查询来从该表名中获取结果。

您也可以使用动态SQL。这是一个MySQL功能,允许您在MySQL服务器中动态创建SQL查询的文本,然后运行这些查询。

听起来像你在试图存储具有不同属性的几类实体(人寿保险,年金,车辆保险等)。

这为您提供了一些架构设计选项。

  1. 你应该使用不同的表(正如你所做的那样),显示 主表中的实体(领导)类(人寿保险)和加入 你需要的特定桌子?

  2. 如果您尝试将所有属性强制转换为单个实体, 保留NULL或空白与a无关的属性 特定的实体类?

  3. 您是否应该为您的实体使用键/值存储 WordPress的wp_postmeta表呢?

  4. 如果您对属性值进行大量搜索,则选项3有一个缺点:它要求您的所有属性都以相同的数据类型存储。该数据类型可能是varchar(n)。这意味着搜索数字属性值的范围很困难。例如,'10' BETWEEN '1' AND '9'被视为文字,但这是无意义的数字。您可以使用隐式类型转换来击败该问题,但这会使索引的使用失败。也就是说,

     0+meta_value BETWEEN 0 AND 9 
    

    强制比较在meta_value列上以数字方式工作。它有效但不快。话虽如此,选项3是迄今为止最灵活的;您可以在不更改表定义的情况下添加新属性。

    选项2和选项3的组合,将最常搜索的属性值放入主lead表中,可能会产生最强大的解决方案。

    选项1 - 您目前的解决方案 - 是一种性能噩梦,等待您在最不负担的情况下攻击您:当您的应用程序正在扩展时。

    注意:如果您使用MySQL的MariaDB分支,则key_value表可以包含持久的索引虚拟列。例如,

    meta_key   VARCHAR(255),
    meta_value VARCHAR(255), 
    meta_value_int BIGINT(20) AS (0+meta_value) PERSISTENT,
    meta_value_float FLOAT AS (CAST(meta_value AS DECIMAL(30,10))) PERSISTENT
    

    然后,您可以将这些虚拟(使用AS)列定义并快速搜索它们。不以数字开头的meta_value列在虚拟列中的值为0