在当前的数据库设计中,我有一个名为"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。。
是否要创建一个查询,从引号中选择表名,并在其中添加"product_“前缀,然后将其加入到产品表中?
我是说:
SELECT *
FROM `leads` JOIN `product_life_insurance` ON `leads`.`id` = `product_life_insurance`.`leadID`
WHERE `leads`.`id` = '5';我希望从leads表中选择用于联接的表名,并在其中添加"product_“前缀并在我的查询中使用它。
谢谢:)
发布于 2015-03-13 12:25:06
你问:
是否有任何方法创建查询,从引号中选择表名,并向其添加"product_“前缀,然后将其加入到产品表中?
答案是no。在纯SQL中,不能生成表名的变量,然后在查询中使用它们。当然,您可以在主机php代码中这样做。但是,您需要使用一个查询来获取表名,并使用更多的查询从该表名获取结果。
还可以使用动态SQL。这是一个MySQL特性,允许您在MySQL服务器中动态创建SQL查询的文本,然后运行这些查询。
在我看来,你想要存储几类不同属性的实体(人寿保险、年金、车辆保险等)。
这为您提供了一些模式设计选项。
如果对属性值进行大量搜索,则选项3有一个缺点:它要求所有属性都以相同的数据类型存储。该数据类型可能是varchar(n)。这意味着很难搜索数值属性值的范围。例如,'10'被BETWEEN '1' AND '9'视为文本,但这在数字上是无稽之谈。您可以使用隐式类型转换来解决这个问题,但这会使索引的使用失败。那是,
0+meta_value BETWEEN 0 AND 9 强制比较在meta_value列上进行数值计算。它能工作,但不快。尽管如此,选项3是迄今为止最灵活的;您可以在不更改表定义的情况下添加新属性。
将最常见的搜索属性值放入主lead表中的选项2和选项3的组合可能会产生最健壮的解决方案。
选项1 --您目前的解决方案--是一个性能噩梦,等待您在最负担不起的时候攻击它:因为您的应用程序正在扩展。
注意:如果您使用的是MariaDB分叉的MySQL,您的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。
https://stackoverflow.com/questions/29031899
复制相似问题