我不太确定这是否可能,或者是否属于数据透视表的类别,但我想我应该去找专业人士看看。

我有三个基本表:卡、财产和卡财产。由于卡片不具有相同的属性,并且同一属性通常有多个值,因此我决定使用联合表方法来存储数据,而不是在卡片表中使用非常大的列结构。

属性表是基本的关键字/值类型表。这样您就有了关键字 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!你是我唯一的希望。

有帮助吗?

解决方案

其他提示

相关但值是值保存在单独的列中,并且您已经提前知道您的“特殊类型”:
SQL查询按月比较产品销量

否则,我将使用存储过程中的光标来执行此操作,或者在业务或表示层中执行转换。

如果您知道所有情况,请刺入 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

不要因数据库中相关记录的串联存储而崩溃。这不完全是最佳实践。

您所描述的是一个数据透视表。数据透视表是 难的. 。我建议尽可能避免使用它们。

为什么不直接读入相关行并在内存中处理它们呢?听起来你不会花太多毫秒来做这件事......

一种选择是让 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”。

我的属性表确实有一个类型/格式,这样我就知道在处理整数值时如何进行转换/评估。我不确定它是否与这个问题相关。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top