2011-01-23 5 views
0

J'ai un site où les gens enregistrent les résultats des jeux. 95% des jeux sont joués en solo, mais les 5% qui ne sont pas à l'écart des statistiques de victoire-tirage au sort pour chaque scénario.en utilisant une base de données relationnelle pour stocker les résultats de jeux en tête-à-tête (-to-head)

Chaque bataille a 2 côtés, et tous les résultats possibles sont:

  • Side 1 victoires
  • Side 2 victoires
  • Dessine

Si 2 personnes jouent les uns des autres, et les deux enregistrer un jeu, vous obtenez 2 victoires pour un côté donné quand il devrait y avoir seulement un, (donner un sens?) et il rejette la cote d'équilibre. Ces enregistrements devraient être fusionnés quand vient le temps d'afficher les statistiques de la bataille.

Mon bidouille d'origine était de programmer le PHP tel que même date de jeu + même résultat = groupe en un seul résultat que, mais que la base d'utilisateurs a augmenté les collisions (des gens qui jouent le même jour et d'obtenir le même résultat par hasard) sont devenus plus fréquents. Comme ma capacité de programmation a augmenté, je me sens prêt à éliminer le kludge et le remplacer par un gestionnaire en tête-à-tête, mais j'ai du mal à trouver une structure de base de données acceptable.

Actuellement, tous les enregistrements sont stockés dans une table, battle_results, qui a la structure suivante:

[play_id] [user_id] [battle_id] [play_date] [win_side] 
    000001 007  DeRa001 2010-01-01  1 
    000002 010  DeRa001 2010-01-01  1 

Je veux donner à mes utilisateurs la possibilité de la liste si elle était un solo ou en tête-à-tête jouer, et de quel côté ils jouaient, donc je prévois de modifier la table comme ça:

[play_id] [user_id] [battle_id] [play_date] [win_side] [play_type] [user_side] 
    000001 007  DeRa001 2010-01-01 1   multi  2 
    000002 010  DeRa001 2010-01-01 1   multi  1 

c'est assez facile. Mais les utilisateurs doivent être en mesure de dire avec qui ils jouaient. Au début, je pensais un grand nombre à plusieurs tableau ferait l'affaire:

[play_id] [user_id] [opponent_id] 
    00001  007  010 

mais je me suis aperçu que lorsque l'adversaire présente le même dossier que vous serez juste colonnes: recul

[play_id] [user_id] [opponent_id] 
    00001  007  010 
    00002  010  007 

et je n'ai vraiment aucune idée de la façon de tirer ces données et de construire un ratio gagnant-tirage gagnant qui reconnaîtrait que ces gens jouaient tous ensemble ...

Ai-je un sens? Comment puis-je faire correspondre ces enregistrements?

Répondre

1

Je le ferais légèrement différent.

Je suppose que vous avez un tableau battle et pour chaque bataille il peut y avoir plusieurs jeux où deux personnes jouent ensemble.

battle_results contiendraient:

 
play_id battle_id play_date play_type 
     1  DeRa001 2011-01-01  multi 

Maintenant, vous avez besoin d'une nouvelle table participants qui répertorie les participants dans chaque pièce:

 
play_id user_id is_winner position 
     1  007   0 Side1 
     1  010   1 Side2 

Cette table aurait (play_id, user_id) comme clé primaire, donc le même utilisateur ne peut pas jouer deux fois pour le même jeu (ceci résout le problème que la même combinaison peut être insérée deux fois avec une "direction" différente) Notez que play_id est unique seul jouer. Donc vous aurez toujours deux rangées avec le même play_id. Editer: vous pouvez indiquer un tirage en réglant is_winner sur 0 pour tous les participants à un jeu.

Pour en savoir avec qui un utilisateur spécifique (par exemple 007) joué est alors simple:

 
SELECT user_id 
FROM participants 
WHERE play_id IN (SELECT p2.play_id 
        FROM participants p2 
        WHERE p2.user_id = '007') 

Pour trouver le nombre total de victoires pour un utilisateur:

 
SELECT count(*) 
FROM participants 
WHERE user_id = '007' 
AND is_winner = 1 

Pour trouver la victoire/ratio de perte:

 
SELECT total_loss/total_wins 
FROM ( 
    SELECT user_id, 
     count(CASE WHEN is_winner = 0 THEN 1 ELSE NULL) as total_loss, 
     count(CASE WHEN is_winner = 1 THEN 1 ELSE NULL) as total_wins 
    FROM participants 
) T 
WHERE user_id = '007' 
0

Quel est le problème avec le stockage des données comme ceci:

[battle_id] [opponent_1] [opponent_2] [result_1] [result_2] 
    1   007   010   1   0 
    2   011   007   0   1 
    3   007   012   0   0 

recherche 007 joueur gagne (entraînera 2):

select count(*) from battles 
where 
    (opponent_1 = '007' AND result_1 = 1 and result_2 = 0) 
    OR 
    (opponent_2 = '007' AND result_1 = 0 and result_2 = 1) 

recherche de joueurs 007 matches nuls (entraînera 1):

select count(*) from battles 
where 
    (opponent_1 = '007' AND result_1 = 0 and result_2 = 0) 
    OR 
    (opponent_2 = '007' AND result_1 = 0 and result_2 = 0) 

etc.

+0

2 problèmes - le nombre d'adversaires varie, et ma difficulté est de rechercher les résultats d'une bataille particulière, et tryi ng pour fusionner des enregistrements où les joueurs jouaient ensemble (plusieurs enregistrements de site = 1 jeu de monde réel) ... c'est le noeud de mon problème – Drew

+0

Ah .. N'a pas remarqué l'exigence de plus de 2 joueurs. Cela ne fonctionnera pas alors :( –

Questions connexes