Mysql 如何检索;“动态”;作为正常记录存储在多行中的属性?

Mysql 如何检索;“动态”;作为正常记录存储在多行中的属性?,mysql,sql,foreign-keys,relational,Mysql,Sql,Foreign Keys,Relational,我有一个基于关系型MySQL数据库的系统,允许人们存储“潜在客户”的详细信息。此外,人们可以创建自己的列来存储数据,然后在添加新帐户时可以在其下添加数据。表结构如下所示: 线索- 身份证件 电子邮件, 用户id 属性- 身份证件 属性名称, 用户id 属性值- 铅字, 属性id, 价值 用户id 显然,在这些表中,“user_id”指的是一个“Users”表,其中只包含可以登录系统的用户 我正在编写一个函数来输出潜在客户的详细信息,目前我只是将基本的潜在客户详细信息作为一个查询,然后遍历与该潜在

我有一个基于关系型MySQL数据库的系统,允许人们存储“潜在客户”的详细信息。此外,人们可以创建自己的列来存储数据,然后在添加新帐户时可以在其下添加数据。表结构如下所示:

线索- 身份证件 电子邮件, 用户id

属性- 身份证件 属性名称, 用户id

属性值- 铅字, 属性id, 价值 用户id

显然,在这些表中,“user_id”指的是一个“Users”表,其中只包含可以登录系统的用户

我正在编写一个函数来输出潜在客户的详细信息,目前我只是将基本的潜在客户详细信息作为一个查询,然后遍历与该潜在客户关联的每个属性值(在属性表上连接以获得名称),然后在PHP中连接数组。这有点混乱,我想知道是否有一种方法可以在一个SQL查询中实现这一点。我读过一些关于“透视表”的东西,但我很难理解它是如何工作的


任何帮助都将不胜感激。谢谢

我想看看这个。这解释了枢轴的基本原理:

“透视表”或“交叉表报告”SQL特征函数:Do 它不带“如果”、“案例”或“组”。是的,它是有用的 此…“if”语句在中使用时有时会导致问题 组合。这是一个简单的秘密,这也是为什么他们几乎在 所有数据库,都是以下函数:符号(x)返回-1,0,+1 对于值x<0、x=0、x>0,abs(符号(x))分别返回0 如果x=0,则为1,如果x>0或x<0,则为 因为只有当x=0时才返回1


它还解释了一种更简单的旋转考试的方法。也许这可以为它提供一些信息?

您可以在一个查询中执行以下旋转操作:

select l.id lead_id,
       l.email,
       group_concat(distinct case when a.attr_name = 'Home Phone' then v.value end) HomePhone,
       ...
from leads l
left join attr_values v on l.id = v.lead_id
left join attributes a on v.attr_id = a.id
group by l.id

您需要为要显示的每个属性包含一个单独的
group\u concat
派生字段。

您可能希望从mysql中获得一个sql值(
attr\u name
)。这一原则被称为(有时也称为交叉表或交叉表查询),mysql不支持这一原则。不是因为mysql不够,而是因为pivot操作不是一个数据库操作-结果不是一个正常的数据库表,并且是为进一步的数据库操作而设计的透视操作的唯一目的是显示-这就是为什么它属于显示层,而不是数据库

因此,任何试图从mysql获取数据透视表的解决方案都是有漏洞的。我建议以正常格式从数据库获取数据,方法如下:

select *
from attr_values join attributes using on attr_id = attributes.id
    join leads on leads.id = lead_id

然后用表示语言(PHP、JSP、Python或任何您使用的语言)转换数据库输出。

我将谨慎地假设pivot将实现简化目标。只有当属性名称一致时,Pivot才会工作。既然你给它绑定了一个用户ID,我想它不会。此外,一个属性名将有多个值。恐怕pivot表不会产生您想要的结果

我建议您将事务表和报告表分开。有一个ETL例程,该例程将通过转换进行清理(即,使attr_名称和attr_值保持一致)。这将使您的报告更有意义


总之,对于直接输出到最终用户来说,PHP是最好的选择。对于报告,请先将EAV转换为行/列,然后再尝试对其进行报告。

MySql不支持Pivot命令。恩,它是免费的。@dbase(微软?)男:不是“恩,它是免费的”,而是“恩,它是一个数据库”(不像…)。Pivot命令不属于数据库,而是属于表示级别。这是一个好问题,尽管标题有误导性——在单个查询中很容易实现,通常只是连接所有表——但这可能不是您想要的。编辑标题。@Tomas你的想法吸引了我。我想订阅你的时事通讯。