Combina dati da due tabelle: è necessaria una guida

1

Ho sviluppato un sito Web con un backend mysql, ma non sono soddisfatto di come ottengo un set di dati e non so come ottenere un altro set di dati.

La pagina in questione è:

link

I risultati sono mostrati fino a ottobre quindi ci sono alcuni dati da usare.

Sto tracciando i risultati da due tabelle mysql (vedi sotto), ma il codice che ho usato è troppo brutto da tollerare. Sì, funziona, ma ho degli standard! Pensa a chiamate al database per ogni squadra. Penso che i join dovrebbero essere usati, ma non riesco a farlo funzionare.
Idealmente (credo) l'array di risultati convertirà i teamID in nomi di squadre e userà i nomi per le colonne VP vincitore e perdente.

La tabella delle classifiche sulla pagina non funziona affatto: ciò che vedi è codificato a mano solo per mostrare ciò che è necessario.

Le tabelle sono:

teams:

id--autoincremented
teamID--Asssigned to each team as part of the game
teamName

games:

id--autoincremented
gameID--I suspect this is not needed since it duplicates id.
teamA
teamB 
date
winner
IMPmargin
winnersVPs
losersVPS

Il gioco è bridge e IMP e VP sono punteggi. I VP sono derivati da IMP e il perdente spesso ottiene VP. Vedi la pagina web per i dettagli, ma non penso che sia rilevante per il mio problema.

Ecco alcuni dati dalla tabella dei giochi:

id  gameID  teamA  teamB  date        winner  IMPmargin  winnersVPs  losersVPs
1   1       11     18     2013-09-25  18      12         20          10
2   2       12     17     2013-09-25  12      22         22          8
3   3       13     16     2013-09-25  13      20         21          9
4   4       14     15     2013-09-25  14      0          15          15
5   5       19     99     2013-09-25  NULL    NULL       NULL        NULL

Il team 99 è un manichino per una settimana bye per una squadra.

Se le tabelle sono progettate troppo male, fammi sapere come farle funzionare meglio.

Spero che sia abbastanza per qualcuno che mi indichi la giusta direzione.

    
posta Bill 24.08.2013 - 00:40
fonte

1 risposta

3

Un join è davvero quello che stai cercando.

Considera il seguente link sqlfiddle - (tutte le parti si trovano di seguito, il che rende più semplice se vuoi ... beh, armati di esso)

Il DDL è:

create table team (
    id int,
    teamId int,
    teamName varchar(16)
  );

create table game (
    id int,
    gameId int,
    teamA int,
    teamB int,
    gameDate date,
    winner int,
    IMPmargin int
  );

create table vp (
    margin int,
    winVp int,
    loseVp int
  );

I dati associati:

insert into team values
  (1,1,"Team A"),
  (2,2,"Team B"),
  (3,3,"Team C");

insert into game values
  (1,1,1,2,'2013-09-25',1,19),
  (2,2,1,3,'2013-09-25',1,10),
  (2,2,2,3,'2013-09-25',2,14);

insert into vp values
  (10,0,0),
  (11,2,1),
  (12,4,3),
  (13,7,5),
  (14,10,8),
  (15,13,11),
  (16,17,14),
  (18,26,22),
  (19,32,27);

E la query:

select
  G.id,
  A.teamName as "team A",
  B.teamName as "team B",
  G.gameDate,
  W.teamName as "winner",
  G.IMPmargin,
  V.winVp,
  V.loseVp
from
  game G
  join team A on (G.teamA = A.id)
  join team B on (G.teamB = B.id)
  join team W on (G.winner = W.id)
  join vp V on (G.IMPmargin = V.margin)

Nota come la relazione tra il gioco ( G ) viene fatta tre volte nella tabella squadra - come A , B e W .

Puoi vedere le relazioni tra questi nel diagramma:

 +---------------+       +----------------+     +--------------+
 | team          |       | game           |     | vp           |
 |---------------|       |----------------|     |--------------|
 | id            +---+   | id             |  +--+ margin       |
 | teamId        |   |   | gameId         |  |  | winVp        |
 | teamName      |   +---+ teamA          |  |  | loseVp       |
 +---------------+   +---+ teamB          |  |  +--------------+
                     |   | gameDate       |  |
                     +---+ winner         |  |
                         | IMPmargin      +--+
                         +----------------+

Se hai una tabella punti vittoria discreta, puoi inserirla anche nel database e unirti contro il margine ai punti vittoria.

Torna ai join stessi ...

Quando fai un Join team A on (G.teamA = A.id) stai dicendo che una questa cosa in questa tabella è una quella cosa in un'altra tabella. Il valore di teamA in gioco è uguale a id nella tabella team.

Una volta stabilita la relazione (e di nuovo per B e W), puoi selezionare le cose dalle tabelle A , B e W come parte della query.

Potresti anche trovare quanto segue per essere utile:

E alcuni libri (O'Reilly è un editore di cui mi fido e anche se non ho questi libri da solo, sono abbastanza fiducioso che troveresti loro dei riferimenti utili)

risposta data 24.08.2013 - 02:21
fonte

Leggi altre domande sui tag