设计游戏数据库
我试图设计一个数据库来记录我正在进行的游戏的游戏历史。我有3个不同的表格:用户,gamehistories和gamescores。设计游戏数据库
列于表:
用户:UID,显示名称,电子邮件
gamehistories:GID,发布商ID,开始(日期时间),结束(日期时间)
gamescores: gid,uid,得分
我试图给出用户ID(uid)下面的结果集:
对手的显示名称,我的得分,对手的得分,持续时间
任何想法?我的设计好吗?我如何查询这些表以获取给定uid的游戏历史记录?
我会的东西是这样的
SELECT u.displayname OpponentsName,
gsYours.score MyScore,
gs.score OpponenetsSCore
FROM gamescores gs INNER JOIN
(
SELECT gs.gid,
gs.uid,
gs.score
FROM gamescores gs
where gs.uid = yourUserID
) gsYours ON gs.gid = gsYours.gid
AND gs.uid <> gsYours.uid INNER JOIN
users u ON gs.uid = u.uid INNER JOIN
gamehistories gh ON gs.gid = gh.gid AND gh.pubID = whatYouRequireHere
不能确定你希望如何链接到gamehistories表。
select h.* from gamehistories as h join gamescores as g on g.gid=h.gid join users as u on g.uid=u.uid where u.uid=$uid
就在我头顶,不知道是否有任何特殊的SQL魔术我没有使用,但我通常使用连接为此。
我没有看到关于表格的任何明显不好的内容,但是您确实需要一个gamescore id字段,仅用于自动递增唯一标识,如果没有其他内容。我的政策是给每张桌子一个ID,但那只是我。
你的查询有一些明显的缺陷。您只需要检索一个分数 - 您需要两次加入“gamescores”才能检索对手的分数和用户的分数。通过选择'h。*',您只能满足输出要求中的'duration'字段。 – Dathan 2010-04-20 03:36:23
好了,与事实两名选手参加每场比赛,我建议用gamescores
表巩固gamehistories
表武装:
- 用户 UID,显示名称,电子邮件
- 游戏 GID ,pubID,开始,结束,uid1,score1,uid2,score2
这会导致检索t他需要的信息,但增加了一个细微差别 - 您不知道您的用户ID是否在uid1
或uid2
列中,因此您必须同时查询这两个信息。
SELECT users.displayname AS `Opponent Name`,
score1 AS `Your Score`,
score2.score AS `Opponent Score`,
TIMEDIFF(end, start) AS `Duration`
FROM
users INNER JOIN games ON users.uid = games.uid1
WHERE games.gid = (TheGID)
AND games.uid2 = (YourUID)
UNION
SELECT users.displayname AS `Opponent Name`,
score2 AS `Your Score`,
score1.score AS `Opponent Score`,
TIMEDIFF(end, start) AS `Duration`
FROM
users INNER JOIN games ON users.uid = games.uid2
WHERE games.gid = (TheGID)
AND games.uid1 = (YourUID)
有多少玩家可以同时参与游戏? pupID的目的是什么? – Dathan 2010-04-20 03:34:36
2名球员。 pubID是为游戏生成的网址哈希。 – Ronald 2010-04-20 03:45:15