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中为我提供一段代码来实现这个透视结果。
非常感谢您的宝贵时间。
或者还有其他更好的方法来存储数据,这样我就可以轻松获得所需的结果。
答案 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']);
}
根据需要适应您的本地编程环境。
当然,这仅适用于具有相同属性的单个File
或File
。如果您想要显示具有不同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标记的。