透视概念

时间:2009-04-04 07:06:05

标签: mysql pivot-table

HIII,

我的数据库设计为:

Table File (FileID, Name, Details)

Table Attributes (AttID, AttName, AttType)

Table AttValues (FileID, AttID, AttValue)

直到运行时,我们不知道Attributes中有多少File以及名称是什么。

我希望以类似的方式在前端插入后显示:

FileID, FileName, Details, (Rows of Attribute Table as Column here).

即, 任何人都可以在Java或MySQL中为我提供一段代码来实现这个透视结果。

非常感谢您的宝贵时间。

或者还有其他更好的方法来存储数据,这样我就可以轻松获得所需的结果。

2 个答案:

答案 0 :(得分:1)

这需要两个查询。首先选择File

SELECT * FROM File WHERE (...)

然后,获取Attributes

SELECT *
FROM AttValues
     JOIN Attributes ON (Attributes.AttId = AttValues.AttId)
WHERE FileId = $id

后一个查询将为您提供每行Attribute一行,您可以通过编程方式转动以在前端显示:

foreach(row in result) {
    table.AddColumn(Header = row['AttName'], Value = row['AttValue']);
}

根据需要适应您的本地编程环境。


当然,这仅适用于具有相同属性的单个FileFile。如果您想要显示具有不同Attributes的多个文件,则可以改为预取所有AttName

SELECT Attributes.AttId, Attributes.AttName
FROM Attributes 
     JOIN AttValues ON (Attributes.AttId = AttValues.AttId)
WHERE FileId IN ( $list_of_ids )

然后加载如下值:

SELECT *
    FROM AttValues
WHERE FileId IN ( $list_of_ids )

并使用局部关联数组从AttId映射到列索引。

作为最终优化,您可以将最后两个查询合并到OUTER JOIN以避免第三次往返。虽然这可能会增加传输的数据量,但如果您的类库支持命名列,它也可以使表格更容易填充。

答案 1 :(得分:1)

我最近回答了一个类似的问题:How to pivot a MySQL entity-attribute-value schema。答案是特定于MySQL的,但我想这很好,因为问题是用mysql标记的。