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

标签 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

..

是否有办法创建一个查询来从潜在客户中选择表名称并向其添加“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 查询文本,然后运行这些查询。

在我看来,您正在尝试存储具有广泛不同属性的几类实体(人寿保险、年金、车辆保险等)。

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

  1. 您是否应该使用不同的表格(就像您正在做的那样),显示 主表中的实体(主导)类(人寿保险),并加入 您需要哪张特定的 table ?

  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

关于php - 从 SQL 查询中选择要加入的表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29031899/

相关文章:

php - 在 SQL 表中查找具有特定部分值列的行

mysql - MySQL 中的 GROUP BY 子句对具有不同值的记录进行分组

mysql - SQL SELECT --> csv 文件

mysql - php删除脚本

mysql - 数据库性能: Split table or keep together

PHP DateTime 对象 - 时间戳和时区冲突

php - 如何在 php(Laravel) linux 上使用口音

php - 返回准备好的语句中的计数总数

php - HTML PHP - 如何检查用户名是否已经存在

php - 如何获得距离当前日期 3(不同)天(差异)的结果?