我想储存一些关于纸牌游戏Dominion的信息。你不需要对这个游戏了解太多,除了:
我会跟踪更多关于每个游戏(谁玩,谁赢,等等),但我有麻烦的是与“供应”(包括这游戏的十张卡片)。
我想要三张桌子,比如card_name,supply和game
card_name supply game
id | name supply | card game | supply | player1 | player2 | ...
----+--------- --------+------ ------+--------+---------+---------+-----
1 | Village 1 | 1 301 | 1 | 'Mike' | 'Tina' | ...
2 | Moat 1 | 3
3 | Witch 1 | 200
... | ... ... | ...
200 | Armory 我认为这是一个合理的方式来代表“迈克和蒂娜玩了一个游戏,其中包含了村庄,女巫,军械库,和一些其他卡片,我没有费心在这个例子中输入”。考虑到这个结构(或者其他一些,如果你认为我的结构不好的话),我想运行这样的查询:“哪个游戏有女巫和村庄,但没有护城河?”也就是说,我想指定一些任意数量的“包括这些X卡,排除这些Y卡”,并在game表中搜索符合条件的游戏。
我认为这是一个典型的一对多的关系,一个供应有多张卡片,但我不明白用多张卡寻找供应的正确方法。
发布于 2014-05-18 18:50:09
你的数据结构是合理的。我可能建议您也需要一个game_users表,这样用户就不会在单独的列中列出。如果游戏有不同的用户数量,这将是特别重要的。然而,这方面与你的问题无关。
您希望解决“集内集”子查询。您的结构很有用,supply表提供了所需的基本信息。
因此,查询“女巫”、“村庄”而不是“护城河”的适当“供应”记录如下:
select supplyid
from supplies s join
cards c
on s.cardid = c.cardid
group by supplyid
having sum(case when cardname = 'Witch' then 1 else 0 end) > 0 and
sum(case when cardname = 'Village' then 1 else 0 end) > 0 and
sum(case when cardname = 'Moat' then 1 else 0 end) = 0;首先请注意,我更改了名称,因此id列包含单词"id“,表名为复数。
having子句中的每个条件表示卡片上的一个条件。您可以通过加入games来调整它以获取游戏信息。
select g.gameid
from supplies s join
cards c
on s.cardid = c.cardid join
games g
on g.supplyid = s.gameid
group by g.gameid
having sum(case when cardname = 'Witch' then 1 else 0 end) > 0 and
sum(case when cardname = 'Village' then 1 else 0 end) > 0 and
sum(case when cardname = 'Moat' then 1 else 0 end) = 0;https://stackoverflow.com/questions/23725513
复制相似问题