在当前的数据库设计中,我有一个名为" 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 _"它的前缀并在我的查询中使用它。
谢谢:)
答案 0 :(得分:1)
你问:
有没有办法创建一个查询来从Leads中选择表名 添加"产品_"它的前缀,然后将其加入产品表?
答案是否。在纯SQL中,您无法创建表名变量,然后在查询中使用它们。当然,您可以在主机php代码中执行此操作。但是您需要使用一个查询来获取表名,并使用更多查询来从该表名中获取结果。
您也可以使用动态SQL。这是一个MySQL功能,允许您在MySQL服务器中动态创建SQL查询的文本,然后运行这些查询。
听起来像你在试图存储具有不同属性的几类实体(人寿保险,年金,车辆保险等)。
这为您提供了一些架构设计选项。
你应该使用不同的表(正如你所做的那样),显示 主表中的实体(领导)类(人寿保险)和加入 你需要的特定桌子?
如果您尝试将所有属性强制转换为单个实体, 保留NULL或空白与a无关的属性 特定的实体类?
您是否应该为您的实体使用键/值存储 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
。