2010-04-20 13 views
4

J'essaie de concevoir une base de données pour enregistrer des historiques de jeu pour un jeu sur lequel je travaille. J'ai 3 tables différentes: utilisateurs, gamehistories, et gamescores.Conception d'une base de données de jeux

Colonnes pour les tables:

utilisateurs: uid, DisplayName email
gamehistories: GID, pubID, start (datetime), fin (datetime)
gamescores: gid, uid, score

J'essaie de produire le jeu de résultats suivant avec un ID utilisateur (uid):
Le nom d'affichage de l'adversaire, mon score, le score de l'adversaire, la durée

Des idées? Est-ce que mon design est correct? Comment puis-je interroger ces tables pour obtenir des historiques de jeu pour un uid donné?

+0

Combien de joueurs peuvent participer simultanément à une partie? Quel est le but de pupID? – Dathan

+0

2 joueurs. pubID est le hash d'url généré pour le jeu. – Ronald

Répondre

3

Je voudrais aller avec quelque chose comme ça

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 

Pas vraiment sûr comment vous souhaitez créer un lien vers la table gamehistories.

+0

Colonne "uid" dans laquelle la clause est ambiguë? – Ronald

+0

J'ai corrigé cela, désolé. Vous pouvez jeter un coup d'oeil à nouveau. –

+0

Merci. Ne fonctionne toujours pas: Nom de la colonne en double 'uid' – Ronald

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 

Dès le haut de ma tête, je sais pas s'il y a une magie sql spéciale que je n'utilise pas, mais je l'utilise généralement rejoint pour cela.

Je ne vois rien de vraiment flagrant au sujet de vos tables, mais vous avez besoin d'un champ id de gamescore, juste pour l'identifiant unique incrémentant automatiquement si rien d'autre. C'est ma politique de donner à chaque table un identifiant, mais c'est juste moi.

+1

Votre requête a quelques lacunes flagrantes. Vous ne récupérez qu'un seul score - vous devez vous joindre deux fois à des «gamescores» afin de récupérer à la fois le score de l'adversaire et le score de l'utilisateur. Et en sélectionnant 'h. *', Vous ne faites que satisfaire le champ 'duration' dans les exigences de sortie. – Dathan

0

D'accord, armé du fait que deux joueurs participent à chaque match, je suggère de consolider la table gamehistories avec la table gamescores:

  • utilisateurs uid, displayname, email
  • jeux gid , pubID, début, fin, uid1, score1, uid2, score2

Cela se traduit par moins de jointures requises pour récupérer t L'information que vous voulez, mais ajoute une nuance - vous ne savez pas si votre identifiant d'utilisateur sera dans la colonne uid1 ou uid2, donc vous devez interroger les deux.

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) 
Questions connexes