1

嗨,

我有一个数据库设计:

Table File (FileID, Name, Details)

Table Attributes (AttID, AttName, AttType)

Table AttValues (FileID, AttID, AttValue)

直到运行时,才知道 a 中有多少AttributesFile以及什么名称。

我想在前端插入后以如下方式显示:

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

即,任何人都可以提供一段Java 或MySQL 中的代码来实现这个Pivoting Result。

非常感谢您宝贵的时间。

或者有没有其他更好的方法来存储数据,这样我就可以很容易地得到想要的结果。

4

2 回答 2

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']);
}

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


当然,这只适用于具有相同属性的单个File或s。File如果要显示多个不同的文件,Attributes可以改为预取所有AttNames:

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 )

并使用本地关联数组从AttIds 映射到列索引。

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

于 2009-04-04T07:17:42.760 回答
1

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

于 2009-04-04T10:28:02.303 回答