2015-03-13 51 views
0

在当前数据库的设计,我有所谓的“信息”,并开始与product_一些其他表主表(product_life_insurance,product_medical_insurance,...)选择表名从SQL查询中加入

-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_”前缀,它和我的查询中使用它。

谢谢:)

+0

你应该使用mysql的CONCAT函数。 – 2015-03-13 12:12:58

+2

您需要使用动态SQL或在您的应用程序中构建表名。具有相同结构的不同表格通常是数据库设计不佳的标志 - 至少它阻碍了写入查询。 – 2015-03-13 12:14:27

+0

@CFFavor感谢您指点我正确的方向,Iv'e从您今天学到了一件新的伴侣队友:) 现在我可以做到: 'SELECT *,CONCAT('product_',product) AS product_table FROM'leads' WHERE'leads'.'id' ='1000'' – PayamB 2015-03-13 12:21:16

回答

1

你问:

有什么办法来创建一个查询到从信息选择表名和 添加“product_”前缀,然后将其加入到产品表?

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

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

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

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

  1. 你应该使用不同的表(因为你正在做的),显示在主表 实体(铅)类(寿险),并加入 特定的表你需要什么?

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

  3. 如果您使用键/值存储为您的实体, WordPress的wp_postmeta表呢?

如果您对属性值进行大量搜索,则选项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

+0

是的,你是对的,它看起来像我不能在ON子句中使用别名 – PayamB 2015-03-13 12:28:33

+0

顺便说一下,你有任何评论关于我的最后一条评论,我张贴在我的问题?谢谢 – PayamB 2015-03-13 12:36:43

+0

请看我最近的编辑。 – 2015-03-13 14:13:24