嗨,
我的数据库设计如下:
Table File (FileID, Name, Details)
Table Attributes (AttID, AttName, AttType)
Table AttValues (FileID, AttID, AttValue)在运行时之前,还不知道一个File中有多少个Attributes以及名称是什么。
我想在前端插入后以如下方式显示:
FileID, FileName, Details, (Rows of Attribute Table as Column here).也就是说,谁能给我一段Java或MySQL的代码来实现这个旋转结果。
非常感谢您的宝贵时间。
或者有没有其他更好的方法来存储数据,这样我就可以很容易地得到想要的结果。
发布于 2009-04-04 07:17:43
这需要两个查询。首先选择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中,以避免第三次往返。虽然这可能会增加传输的数据量,但如果您的类库支持命名列,它也会使填充表变得更容易。
发布于 2009-04-04 10:28:02
我最近回答了一个类似的问题:How to pivot a MySQL entity-attribute-value schema。答案是特定于mysql的,但我想这是可以的,因为问题是用mysql标记的。
https://stackoverflow.com/questions/716683
复制相似问题