Visualizzazione risultati 1 fino 11 di 11

Discussione: select e estrapolazione dati da più tabelle

  1. #1
    Guest

    Predefinito select e estrapolazione dati da più tabelle

    Salve a tutti, ho bisogno di una dritta per la creazione di uno script in php che mi permette di creare una classifica di campionato italiano di calcio.

    Praticamente io ho creato un calendario nel database dove ogni giornata di campionato corrisponde ad una tabella, dove campi sono: sq_casa (squadra che gioca in casa), sq_trasferta (squadra che gioca in trasferta), gol_casa (gol segnati dalla squadra in casa), gol_trasferta (gol segnati dalla sqaudra in trasferta).

    Ora per creare una classifica in php contenente gol segnati in totale, gol subiti in totale e punteggio totale, penso mi verrebbe facile crearla dato che penso proprio di avere tutti i dati a mia disposizione, in quanto interrogando il database con una funzione semplice e aritmetica che mi permette di capire quanti punti assegnare per ogni squadra, posso tranquillamente assegnare il punteggio totale.

    Il fatto è che non sono poi tanto esperto in php e mysql, in quanto ci studio da autodidatta da circa un mese... però quanto basta per capire che devo agire su più tabelle contemporaneamente utilizzando la funzione JOIN... il fatto è che non ho la più pallida idea su come poter agire... potete darmi una mano?

  2. #2
    Guest

    Predefinito

    Non sei perforza costretto a usare JOIN,
    Ti spiego:

    >Crea 1 query che prende tutti i dati della 1° squadra
    >Crea 1 query che prende tutti i dati della 2° squadra

    >Ora crea un costrutto IF per trovare la squadra che ha vinto
    >Ora aggiorna la classifica aggiornando i punteggi secondo i risultati dell' IF precedente

    E' questo che volevi?
    A_K

  3. #3
    Guest

    Predefinito

    No, perchè i dati li devo estrapolare da più tabelle dato che ho 38 tabelle equivalenti al calendario per tutte le giornate di serie a... come faccio con una query a prendere tutti i dati di una squadra...

    Ho visto in un altro forum una sitazione simile dove viene proposto questo tipo di soluzione:

    select squadra,sum(punti) as punteggio from
    (
    select sq_casa as squadra,
    if(gol_casa > gol_trasferta, 3, if (gol_casa < gol_trasferta, 0,1)) as punti
    from giorno_1
    union all
    select sq_trasferta as squadra,
    if(gol_casa > gol_trasferta, 0, if (gol_casa < gol_trasferta, 3,1)) as punti
    from giorno_1
    )as tab
    group by squadra
    order by punteggio desc
    In questo modo riesco a farmi una classifica virtuale di quella giornata... ora se io volessi sommare i risultati di questa query alla classifica che ho nel database relativa al primo giorno di campionato, che script dovrei fare? in questo modo avendo uno script del genere che va ad aggiornare ad ogni giornata la classifica, mi basta soltanto avviare tale script periodicamente ed il gioco è fatto!
    Ultima modifica di futbolive : 23-01-2011 alle ore 17.51.29

  4. #4
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Ti converrebbe aggiungere un altro campo a quella tabella, il numero della giornata (che sarà ovviamente uguale per tutte le partite che si svolgono nella stessa giornata). Teoricamente nemmeno sarebbe necessario, visto che in ogni giornata le squadre che si affrontano sono sempre diverse (anche nella stessa giornata "in andata" e "in ritorno", l'ordine è invertito).

    Per calcolarti la classifica, questa sarà la query che dovrai eseguire (non l'ho testata... spero sia giusta):
    Codice:
    SELECT squadra, SUM(punti) AS punteggio
    FROM (
       SELECT sq_casa AS squadra, IF(gol_casa > gol_trasferta, 3, IF (gol_casa = gol_trasferta, 1, 0)) AS punti
       FROM campionato
       UNION ALL
       SELECT sq_trasferta AS squadra, IF(gol_casa > gol_trasferta, 0, IF (gol_casa = gol_trasferta, 1, 3)) AS punti
       FROM campionato
    ) AS tab_punti
    GROUP BY tab_punti.squadra
    ORDER BY punteggio DESC
    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  5. #5
    Guest

    Predefinito

    Io ho creato in pratica 38 tabelle con ognuna 10 record equivalenti agli eventi corrispondenti di ogni giornata... quindi tu mi dici di fare un unica tabella, ovvero "campionato", inserire in più un altro campo, ovvero quello del numero della giornata ed inserire 10x38 eventi tutti all'interno di una tabella? perchè se eseguo quella query, che poi è uguale a quella postata da me sopra, mi prende ovviamente solo i dati di un unica tabella...

    Grazie e mi scuso per le mie eventuali ingenuità... non sono molto ferrato sull'argomento (almeno per il momento :))...

  6. #6
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    E' esattamente come hai scritto tu... trattandosi di solo 380 record, e tutti dello stesso tipo, non ha molto senso dividerli in ben 38 tabelle. Così te la cavi con una singola query e ottieni il risultato che ti serve...

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  7. #7
    Guest

    Predefinito

    Ho capito bene allora :)
    Grazie mille per la dritta ;)
    ...E stai bene anche te ^^

    EDIT: ok, così mi riesce... e se volessi inserire nella tabella anche il numero di vittorie, il numero di sconfitte e il numero di pareggi per ogni squadra? ...Poi vorrei aggiungere anche i gol fatti e i gol subiti... per i gol fatti credo di sapere come fare, ovvero sommare per ogni squadra i gol fatti in casa e in strasferta, ma per i gol subiti come dovrei orientarmi? Per darvi una mano a farmi capire meglio come agire vi segnalo meglio la struttura della tabella "campionato":

    Campi: id, giornata, data, sq_casa, sq_trasferta, gol_casa, gol_trasferta (dove gol_casa sono i gol di quell'evento della squadra che gioca in casa; analogamente gol_trasferta). Datemi qualche piccolo aiuto per capire la logica da eseguire perchè proprio non ci arrivo XD.

    Ancora devo popolare tutta la tabella con i 380 records... sarà una faticaccia quindi mi creerò uno script in php che mi agevolerà il tutto... per il momento ho caricato soltanto i dati relativi alle prime due giornate di campionato per provare a realizzare questa classifica... se riuscissi a creare in modo concreto una classifica del genere potrei dire che ho quasi finito il sito che ho in mente di realizzare :) dato che poi si tratterà solamente di creare uno script per l'inserimento e la visualizzazione degli articoli nelle diverse categorie... cosa che ho fatto e strafatto in passato...

    Per sommare i gol fatti per ogni squadra ho pensato di modificare la query in questo modo:
    SELECT squadra, SUM(punti) AS punteggio, SUM(gol_fatti) AS gf
    FROM (
    SELECT sq_casa AS squadra, IF( gol_casa > gol_trasferta, 3, IF( gol_casa = gol_trasferta, 1, 0 ) ) AS punti, gol_casa+gol_trasferta AS gol_fatti
    FROM campionato
    UNION ALL
    SELECT sq_trasferta AS squadra, IF( gol_casa > gol_trasferta, 0, IF( gol_casa = gol_trasferta, 1, 3 ) ) AS punti, gol_trasferta+gol_casa AS gol_fatti FROM campionato
    )
    AS tab_punti

    GROUP BY tab_punti.squadra
    ORDER BY punteggio DESC
    Ma onestamente non ho provato e non so se funzioni...
    Vi ringrazio in anticipo per le vostre risposte ;)
    Ultima modifica di futbolive : 25-01-2011 alle ore 13.19.43

  8. #8
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Questa dovrebbe essere, più o meno, una classifica in stile Televideo RAI:
    Codice:
    SELECT squadra, SUM(punti) AS punteggio, SUM(p_vinte) AS vinte, SUM(p_nulle) AS nulle, SUM(p_perse) AS perse, SUM(r_segnate) AS gol_segnati, SUM(r_subite) AS gol_subiti
    FROM (
       SELECT sq_casa AS squadra, IF(gol_casa > gol_trasferta, 3, IF(gol_casa = gol_trasferta, 1, 0)) AS punti, IF(gol_casa > gol_trasferta, 1, 0) AS p_vinte, IF(gol_casa = gol_trasferta, 1, 0) AS p_nulle, IF(gol_casa < gol_trasferta, 1, 0) AS p_perse, gol_casa AS r_segnate, gol_trasferta AS r_subite
       FROM campionato
       UNION ALL
       SELECT sq_trasferta AS squadra, IF(gol_casa < gol_trasferta, 3, IF(gol_casa = gol_trasferta, 1, 0)) AS punti, IF(gol_casa < gol_trasferta, 1, 0) AS p_vinte, IF(gol_casa = gol_trasferta, 1, 0) AS p_nulle, IF(gol_casa > gol_trasferta, 1, 0) AS p_perse, gol_trasferta AS r_segnate, gol_casa AS r_subite
       FROM campionato
    ) AS tab_punti
    GROUP BY tab_punti.squadra
    ORDER BY punteggio DESC
    Spiegone della logica: all'inizio crei una tabella temporanea in cui associ a ciascuna squadra e ciascuna partita:
    - il punteggio assegnato alla partita (3, 1, 0 punti)
    - se la partita è stata vinta (1) o no (0)
    - se la partita è stata pareggiata (1) o no (0)
    - se la partita è stata persa (1) o no (0)
    - quante reti ha segnato la squadra
    - quante reti ha segnato la squadra avversaria (reti subite)

    Una volta ottenuta questa tabella, ti basta eseguire la somma per colonne, raggruppando per il nome della squadra.

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  9. #9
    Guest

    Predefinito

    Ok grazie mille per la risposta e mi scuso umilmente per l'up precedente...

    Per la query ci stavo quasi arrivando :), il fatto è che non rientravo perfettamente nella logica da seguire :)

    c'è un piccolo problema... non capisco perchè nel momento in cui la devo stampare a video con il ciclo while non mi stampa il primo record.
    Ultima modifica di futbolive : 27-01-2011 alle ore 11.34.12

  10. #10
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Controlla meglio il codice PHP... forse hai eseguito un fetch di troppo prima del ciclo. Quello tipico è questo:
    Codice PHP:
    <?php
    $query
    = "SELECT ...";
    $result = mysql_query ($query, $db);
    while (
    $line = mysql_fetch_array ($result))
    {
    // elabora i risultati, usando $line['nome_campo']
    }
    ?>
    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  11. #11
    Guest

    Predefinito

    Hai ragione, inconsciamente ho eseguito due volte il fetch.
    OK, adesso ho una classifica decente, grazie mille di tutto... argomento chiuso.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •