我正在尝试设计一个数据库来记录我正在进行的游戏的游戏历史记录。我有3个不同的表:用户,gamehistories和游戏核心。
表格列:
用户:uid,displayname,email
gamehistories :gid,pubID,start(datetime),end(datetime)
游戏币:gid,uid,得分
我试图在给定userID(uid)的情况下生成以下结果集:
对手的显示名称,我的分数,对手的得分,持续时间
有什么想法吗?我的设计好吗?如何查询这些表以获取给定uid的游戏历史记录?
答案 0 :(得分:3)
我会选择这样的东西
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 表。
答案 1 :(得分:0)
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魔法,请不要使用,但我通常会使用连接。
我没有看到任何关于你的表格的明显坏事,但你确实需要一个gamecore id字段,只是为了自动递增唯一id,如果没有别的。我的政策是给每张桌子一个id,但那就是我。
答案 2 :(得分:0)
好吧,由于有两位玩家参与每场比赛,我建议将gamehistories
牌桌与gamescores
牌桌合并:
这样可以减少检索所需信息所需的联接数,但会增加一个细微差别 - 您不知道您的用户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)