我不太确定这是否可行,或属于数据透视表类别,但我想我会去专业人士看看。
我有三个基本表:Card,Property和CardProperty。由于卡不具有相同的属性,并且通常具有相同属性的多个值,因此我决定使用联合表方法来存储数据,而不是在我的卡表中具有非常大的列结构。
属性表是基本的关键字/值类型表。所以你有关键字ATK和分配给它的值。还有另一个名为SpecialType的属性,卡可以有多个值,例如“Sycnro”和“DARK”
我想要做的是创建一个视图或存储过程,它为卡片ID,卡片名称和分配给卡片的所有属性关键字提供了指定卡片的ResultSet中的列及其值。理想情况下,我的结果集如下:
ID NAME SPECIALTYPE
1 Red Dragon Archfiend Synchro
1 Red Dragon Archfiend DARK
1 Red Dragon Archfiend Effect
我可以这样计算我的结果。
我想甚至更简单的是根据关键字简单地将属性连接在一起,所以我可以生成一个ResultSet,如:
1 Red Dragon Archfiend Synchro/DARK/Effect
..但我不知道这是否可行。
帮我stackoverflow Kenobi!你是我唯一的希望。
答案 0 :(得分:1)
这是SQL服务器吗?
如果是,那么
Concatenate Values From Multiple Rows Into One Column (2000)
Concatenate Values From Multiple Rows Into One Column Ordered (2005+)
答案 1 :(得分:1)
相关但值是值保存在不同的列中,并且您知道您的“特殊类型”是时间的一部分:
SQL query to compare product sales by month
否则我会在存储过程中使用游标执行此操作,或在业务或表示层中执行转换。
如果您知道所有情况,请搜索sql:
Select
ID,NAME
,Synchro+DARK+Effect -- add a some substring logic to trim any trailing /'s
from
(select
ID
,NAME
--may need to replace max() with min().
,MAX(CASE SPECIALTYPE WHEN "Synchro" THEN SPECIALTYPE +"/" ELSE "" END) Synchro
,MAX(CASE SPECIALTYPE WHEN "DARK" THEN SPECIALTYPE +"/" ELSE "" END) DARK
,MAX(CASE SPECIALTYPE WHEN "Effect" THEN SPECIALTYPE ELSE "" END) Effect
from
table
group by
ID
,NAME) sub1
答案 2 :(得分:0)
不要通过连接来折叠以存储数据库中的相关记录。这不是最佳做法。
您所描述的是数据透视表。数据透视表是 hard 。我建议尽可能避免使用它们。
为什么不直接读入相关的行并在内存中处理它们?听起来你不会花太多毫秒来做这件事......
答案 3 :(得分:0)
一个选项是让Properties具有PropertyType,所以:
table cards
integer ID | string name | ... (other properties common to all Cards)
table property_types
integer ID | string name | string format | ... (possibly validations)
table properties
integer ID | integer property_type_id | string name | string value
foreign key property_type_id references property_types.ID
table cards_properties
integer ID | integer card_id | integer property_id
foreign key card_id references cards.ID
foreign key property_id references propertiess.ID
这样,当您想要设置新的属性值时,可以按其类型对其进行验证。一种类型可以是带有枚举值的“SpecialType”。
答案 4 :(得分:0)
我的属性表有一个类型/格式,这样我知道如何在处理整数值时进行转换/求值。我不确定这是否与这个问题有关。