在当前的数据库设计中,我有一个名为“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_”前缀并在我的查询中使用它。
谢谢:)
最佳答案
你问:
Is there any way to create a query to select table Name from Leads and add the "product_" prefix to it and then join it to product table ?
答案是否。在纯 SQL 中,您无法创建表名变量,然后在查询中使用它们。当然,您可以在主机 php 代码中执行此操作。但您需要使用一个查询来获取表名称,并使用更多查询来从该表名称中获取结果。
您还可以使用动态 SQL。这是 MySQL 的一项功能,允许您在 MySQL 服务器中动态创建 SQL 查询文本,然后运行这些查询。
在我看来,您正在尝试存储具有广泛不同属性的几类实体(人寿保险、年金、车辆保险等)。
这为您提供了一些架构设计选项。
您是否应该使用不同的表格(就像您正在做的那样),显示 主表中的实体(主导)类(人寿保险),并加入 您需要哪张特定的 table ?
如果您尝试将所有属性强制转换为单个实体, 将与某个不相关的属性保留为 NULL 或空白 特定类别的实体?
您是否应该为实体使用键/值存储,方式 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
。
关于php - 从 SQL 查询中选择要加入的表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29031899/