Visualizzazione risultati 1 fino 10 di 10
Like Tree2Likes
  • 1 Post By alemoppo
  • 1 Post By alemoppo

Discussione: sistemare classifica differenzi reti in classifica avulsa

  1. #1
    omgprova non è connesso Utente giovane
    Data registrazione
    03-02-2020
    Messaggi
    67

    Predefinito sistemare classifica differenzi reti in classifica avulsa

    salve spero di trovare supporto per questo mio problema
    in pratica
    estraendo i dati dal db riesco a stampare una classifica in modo corretto
    avrei la necessita di modificarla tenendo conto di

    1 calcolo degli scontri diretti per le squadre a pari punti
    2 della differenza tra reti segnate e subite nei medesimi incontri;
    3 della differenza tra reti segnate e subite nell’intero Campionato
    4 del maggior numero di reti segnate nell’intero Campionato;
    i punti 3-4 gia sono inclusi

    questa è la query
    essendo un po lunga ho preferito postarla su pastbin
    https://pastebin.com/hqCHrPbi

    grazie in anticipo
    per aiuti e suggerimenti

  2. #2
    omgprova non è connesso Utente giovane
    Data registrazione
    03-02-2020
    Messaggi
    67

    Predefinito

    spero che qualcuno su questa mia domanda possa aiutarmi ..in rete non ho trovato nulla

    ritornando al discorso della classifica postato nel primo messaggio

    creando un ciclo while con all interno una serie di array come faccio a determinare quali record sono uguali?

    Codice PHP:
    $classifica ="query postata nell esempio del primo mess";
    $result_c = mysqli_query($conn,$classifica) or die ("queri errata");

    while (
    $row = mysqli_fetch_assoc($result_c)){

    //soluzione 1
    $squadre_pari_punti = array( "id_squadre" => array ($row['id_squadre']),"punti" => array($row['punti']));


    /*essendo in un ciclo while
    l array id[0] dovrebbe corrispondere con array punti[0]...ecc..ecc..
    */

    //soluzione 2

    $squadre_pari_punti = array ("scontri" => array($row['id_squadre'],$row['punti']));

    /*
    così dovrei avere gia associato id e punteggio
    */
    }
    /*
    ma poi rimango bloccato perchè non so come sviluppare la funzione per avere il risultato che cerco.
    una volta che ho il risultato (gli id a pari punti) potrei avviare un altra query per stabilire i punti tra gli scontri diretti
    */
    Ultima modifica di omgprova : 22-04-2021 alle ore 15.22.39

  3. #3
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,067

    Predefinito

    Non mi torna una cosa: nel ciclo while tu sovrascrivi ogni volta la variabile "$squadre_pari_punti" (in entrambe le soluzioni): i vari calcoli/print della classifica la esegui all'interno di quel while?

    Comunque, non ho ben capito la domanda: io salverei in una struttura dati i vari punteggi e poi ciclando fai i tuoi confronti con if etc...

    Ciao!

  4. #4
    omgprova non è connesso Utente giovane
    Data registrazione
    03-02-2020
    Messaggi
    67

    Predefinito

    alemoppo
    Non mi torna una cosa: nel ciclo while tu sovrascrivi ogni volta la variabile "$squadre_pari_punti" (in entrambe le soluzioni): i vari calcoli/print della classifica la esegui all'interno di quel while?
    all interno del while mi estraggo i record

    quindi di conseguenza sono costretto a fare (sempre secondo la mia logica da non programmatore )
    Codice PHP:
    $classifica ="query postata nell esempio del primo mess";
    $result_c = mysqli_query($conn,$classifica) or die ("queri errata");

    while (
    $row = mysqli_fetch_assoc($result_c)){

    //soluzione 3 questa credo sia la piu adatta

    $classifica = array($row['id']=>$row['punti']);

    per poi sempre all interno del while trovare i punteggi uguali associati con l id
    per poi interrogare nuovamente il db

    }
    Comunque, non ho ben capito la domanda: io salverei in una struttura dati i vari punteggi e poi ciclando fai i tuoi confronti con if etc...
    se ho ben capito ti mi dici di salvare la classifica in una tabella nel db?
    non posso farlo
    perchè potrebbero esserci piu tornei..


    la mia idea come spiegavo poco fa è
    1 estrarre la classifica con una query
    trovare le squadre con pari punti tramite funzione (da capire come fare)
    rifare una nuova query per stabilire gli scontri diretti
    stampare la classifica nel nuovo ordine

    se ho
    classifica
    a 10
    b 10
    c 10
    d 8
    e 8
    la funzione che sto cercando di capire come fare mi dovrà dire che
    A B e C hanno 10 e C e D hanno 8

    grazie per l interessamento
    Ultima modifica di omgprova : 23-04-2021 alle ore 01.09.34

  5. #5
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,067

    Predefinito

    Probabilmente non sto capendo perché non ho letto la query (è lunghissima!).
    Mi son fermato alla prima parte (la parte restante immagino siano condizioni), quindi comunque abbiamo che ad ogni "ciclo", abbiamo disponibili:
    Codice:
     squadra,
    id_squadre,
    nome_squadra,
    logo_squadra,
    sum(punti) as punti,
    sum(g_fatti) as g_fatti,
    sum(g_subiti) as g_subiti,
    sum(differenza) as differenza,
    sum(disputate) as giocate,
    sum(vinte) as vinte,
    sum(pareggiate) as pareggiate,
    sum(perse) as perse
    $_row['squadra'], $_row['id_squadre'],..., $_row['punti'], $_row['g_*'], ...

    Se fin qui ho capito bene, ad ogni ciclo abbiamo le informazioni $row[] di una squadra (ho il dubbio: perché abbiamo il campo "id_squadre" e non "id_squadra"?). Io farei così:

    Codice PHP:

    $query
    = mysqli_query(...);

    while (
    $row = mysqli_fetch_assoc($result_c))
    {
    $squadre[] = array('squadra' => $_row['squadra'], 'id_squadre' => $_row['id_squadre'], 'punti' => $_row['punti'], 'g_*' => $_row['g_*'], ...);
    }

    //qui abbiamo disponibile squadre[0, ..., i, ... n] dove ad ogni indice abbiamo tutte le info della squadra i-esima. Da qui poi puoi "ordinare" l'array seconda dei punti etc etc.

    /*
    //ordini a secondo delle tue necessità da PHP
    usort($squadre, function($a, $b) {
    $retval = $a['punti'] <=> $b['punti'];
    if ($retval == 0) {
    $retval = $a['goal'] <=> $b['goal'];
    if ($retval == 0) {
    $retval = $a['altro_campo'] <=> $b['altro_campo'];
    }
    }
    return $retval;
    });
    */

    /*qui avrai l'array $squadre ordinato*/
    Potrei aver detto castronerie visto che non ho ben inteso il problema. Il succo è che, visto che ho inteso che vuoi ordinarle con condizioni "complicate", forse è meglio spostare il problema su PHP (anche se in realtà solitamente è bene fare come stavi facendo, ovvero delegare tutti i calcoli a mysql).

    la funzione che sto cercando di capire come fare mi dovrà dire che
    A B e C hanno 10 e C e D hanno 8
    Anche questo potresti farlo con PHP...

    Ciao!
    Ultima modifica di alemoppo : 23-04-2021 alle ore 21.45.22

  6. #6
    omgprova non è connesso Utente giovane
    Data registrazione
    03-02-2020
    Messaggi
    67

    Predefinito

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    Probabilmente non sto capendo perché non ho letto la query (è lunghissima!).
    Mi son fermato alla prima parte (la parte restante immagino siano condizioni), quindi comunque abbiamo che ad ogni "ciclo", abbiamo disponibili:
    Codice:
     squadra,
    id_squadre,
    nome_squadra,
    logo_squadra,
    sum(punti) as punti,
    sum(g_fatti) as g_fatti,
    sum(g_subiti) as g_subiti,
    sum(differenza) as differenza,
    sum(disputate) as giocate,
    sum(vinte) as vinte,
    sum(pareggiate) as pareggiate,
    sum(perse) as perse
    $_row['squadra'], $_row['id_squadre'],..., $_row['punti'], $_row['g_*'], ...

    Se fin qui ho capito bene, ad ogni ciclo abbiamo le informazioni $row[] di una squadra (ho il dubbio: perché abbiamo il campo "id_squadre" e non "id_squadra"?). Io farei così:

    Codice PHP:

    $query
    = mysqli_query(...);

    while (
    $row = mysqli_fetch_assoc($result_c))
    {
    $squadre[] = array('squadra' => $_row['squadra'], 'id_squadre' => $_row['id_squadre'], 'punti' => $_row['punti'], 'g_*' => $_row['g_*'], ...);
    }

    //qui abbiamo disponibile squadre[0, ..., i, ... n] dove ad ogni indice abbiamo tutte le info della squadra i-esima. Da qui poi puoi "ordinare" l'array seconda dei punti etc etc.

    /*
    //ordini a secondo delle tue necessità da PHP
    usort($squadre, function($a, $b) {
    $retval = $a['punti'] <=> $b['punti'];
    if ($retval == 0) {
    $retval = $a['goal'] <=> $b['goal'];
    if ($retval == 0) {
    $retval = $a['altro_campo'] <=> $b['altro_campo'];
    }
    }
    return $retval;
    });
    */

    /*qui avrai l'array $squadre ordinato*/
    Potrei aver detto castronerie visto che non ho ben inteso il problema. Il succo è che, visto che ho inteso che vuoi ordinarle con condizioni "complicate", forse è meglio spostare il problema su PHP (anche se in realtà solitamente è bene fare come stavi facendo, ovvero delegare tutti i calcoli a mysql).


    Anche questo potresti farlo con PHP...

    Ciao!
    la query sistema già le squadre in base a

    1 punti
    2 partite giocate
    3 differenza reti
    4 gol fatti

    nel finale della query è presente order by ......

    il problema è che non tiene conto degli scontri diretti
    ovvere se 2 o piu squadre sono a pari punti bisogna prima conteggiare i punti fatti negli gli scontri diretti

    se la classifica finale fosse
    milan 10
    inter 10
    juventus 10
    ......
    poi tutte le altre squadre

    bisogna conteggiare i punti ottenuti negli scontri tra

    andata e ritorno
    milan -inter

    inter- juventua

    juventus -milan

    tornando alla query che ho postato
    da lì come ottengo gli id delle squadre che hanno pari punti così da avviare una nuova query per verificare gli scontri?

    in rete c'era una vecchia discussione simile dove gli veniva suggerito di avviare un array per stabilire quali squadre avessero pari punti...

    io sto cercando di fare quell array ma se ci sono altri metodi ancora meglio
    sono sempre disponibile ad imparare sempre piu cose


    (ho il dubbio: perché abbiamo il campo "id_squadre" e non "id_squadra"?). Io farei così:
    è stato un errore iniziale nella costruzione della tabella squadre poi me lo sono portato dietro per tutte le query e l ho lasciato in quel modo
    grazie ancora
    Ultima modifica di omgprova : 24-04-2021 alle ore 16.45.17

  7. #7
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,067

    Predefinito

    Ok, l'array in realtà è già nell'esempio che ti ho fatto ($squadre[]).

    Tu stai facendo:
    Codice:
    ORDER BY punti DESC, differenza DESC ,g_fatti DESC
    Questo significa che i risultati vengono ordinati per punti in ordine decrescende. A parità di punti verranno ordinati per differenza. A parità di punti e differenza verranno ordinati per g_fatti.

    La tua richiesta, se ho capito bene è che a parità di punti, occorre modificare i punti acquisiti negli scontri diretti: questi punti immagino abbiano priorità rispetto "differenza" e "g_fatti", giusto?

    Quindi la cosa più semplice da fare tramite PHP è questa: avendo l'array $partite, puoi aggiungere gli eventuali punti degli scontri diretti (non so quanti ne vadano aggiunti).

    da lì come ottengo gli id delle squadre che hanno pari punti così da avviare una nuova query per verificare gli scontri?
    Così:
    Codice PHP:
    /* ---------------------------------------------- */
    /*codice precedente di estrazione dati in $squadre*/
    /* ---------------------------------------------- */

    $len = count($squadre); //numero di squadre

    for($i = 0; $i < len - 1; $i++)
    {
    if(
    $squadre[$i]['punti'] == $squadre[$i + 1]['punti'])
    {
    // 1) esegui la query che guarda lo scontro tra $squadre[$i]['id_squadre'] e $squadre[$i + 1]['id_squadre']
    // 2) aggiusti $squadre[$i]['punti'] a secondo dell'esito (non so quanti punti vadano aggiunti in questi casi)
    }
    }

    // 3) riordini l'array $squadre con $squadre[]['punti'] aggiornato
    Spero di aver capito il problema e di essermi spiegato (non conosco granché le regole del calcio).

    Ciao!
    omgprova likes this.

  8. #8
    omgprova non è connesso Utente giovane
    Data registrazione
    03-02-2020
    Messaggi
    67

    Predefinito

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    Ok, l'array in realtà è già nell'esempio che ti ho fatto ($squadre[]).

    Tu stai facendo:
    Codice:
    ORDER BY punti DESC, differenza DESC ,g_fatti DESC
    Questo significa che i risultati vengono ordinati per punti in ordine decrescende. A parità di punti verranno ordinati per differenza. A parità di punti e differenza verranno ordinati per g_fatti.

    La tua richiesta, se ho capito bene è che a parità di punti, occorre modificare i punti acquisiti negli scontri diretti: questi punti immagino abbiano priorità rispetto "differenza" e "g_fatti", giusto?

    Quindi la cosa più semplice da fare tramite PHP è questa: avendo l'array $partite, puoi aggiungere gli eventuali punti degli scontri diretti (non so quanti ne vadano aggiunti).



    Così:
    Codice PHP:
    /* ---------------------------------------------- */
    /*codice precedente di estrazione dati in $squadre*/
    /* ---------------------------------------------- */

    $len = count($squadre); //numero di squadre

    for($i = 0; $i < len - 1; $i++)
    {
    if(
    $squadre[$i]['punti'] == $squadre[$i + 1]['punti'])
    {
    // 1) esegui la query che guarda lo scontro tra $squadre[$i]['id_squadre'] e $squadre[$i + 1]['id_squadre']
    // 2) aggiusti $squadre[$i]['punti'] a secondo dell'esito (non so quanti punti vadano aggiunti in questi casi)
    }
    }

    // 3) riordini l'array $squadre con $squadre[]['punti'] aggiornato
    Spero di aver capito il problema e di essermi spiegato (non conosco granché le regole del calcio).

    Ciao!
    grazie gentilissimo con un mio amico avevamo risolto così

    Codice PHP:
    <?php
    $filtro
    = "";
    $n=count($pari);
    $k="";
    $kid=0;
    $tmp="";
    foreach(
    $pari as $value){

    $tmp=$value[1];


    if (
    $tmp===$k){
    echo
    "Trovato ".json_encode($value[1])."|".json_encode($value[0])."|".$kid."|".$k."<br>";
    $filtro.=$value[0].",".$kid.",";
    }
    $kid=$value[0];
    $k=$value[1];
    //avtmp =avulsa temporanea richiamata nella query
    }
    $avtmp = " and id_squadra1 in (".$filtro."0) and id_squadra2 in(".$filtro ."0) and disputate = 1";
    tutto funzionante ma il problema sorge se ho piu coppie di squadre con punti uguali
    2 squadre a 10pt
    e 2 squadre a 7pt
    la query avvia la verifica tra le 4 squadre
    ho provato anche il tuo script con la mia query ha lo stesso problema

    questo è l echo di $vtmp

    and id_squadra1 in (38 , 14,11 , 13,0) and id_squadra2 in(38 , 14,11 , 13,0) and disputate = 1
    ma doveva essere 31,14 e 11,13
    ho provato ad aggiungere or nel finale di $filtro
    ecco l echo
    and id_squadra1 in (38 , 14 or 11 , 13 or 0) and id_squadra2 in(38 , 14 or 11 , 13 or 0) and disputate = 1
    ma non mi stampa nulla
    Ultima modifica di omgprova : 25-04-2021 alle ore 13.07.47

  9. #9
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,067

    Predefinito

    Non riesco a capire pienamente il tuo codice. $pari cosa è? un array che contiene le squadre con gli stessi punti? Vedo anche che i campi sono codificati in json.

    Comunque, la soluzione che ti avevo proposto dovrebbe supportare più coppie di squadre con gli stessi punti anche se differenti.

    L'unico problema può essere se ci sono più di 2 squadre con lo stesso punteggio: in tal caso invece di modificare "2) aggiusti $squadre[$i]['punti']" dovresti aggiungere un ulteriore campo, e poi ordinare (tramite PHP) prima per punti e poi per questo nuovo campo.

    Prima di continuare con il punto 3, assicurati di aver codificato correttamente i punti 1 e 2 (ad esempio con le echo, che già stai utilizzando).

    Ciao!
    omgprova likes this.

  10. #10
    omgprova non è connesso Utente giovane
    Data registrazione
    03-02-2020
    Messaggi
    67

    Predefinito

    Non riesco a capire pienamente il tuo codice. $pari cosa è? un array che contiene le squadre con gli stessi punti?
    si è l array che contiene id e punteggio

    Vedo anche che i campi sono codificati in json
    è solo l echo del risultato per avere un riscontro poi sarà tolto

    Comunque, la soluzione che ti avevo proposto dovrebbe supportare più coppie di squadre con gli stessi punti anche se differenti.
    il problema è proprio questo non li separa per punteggio ma li raggruppa tutti assieme senza far distinzione come ti spiegavo nel messaggio precendente

    questo
    tutto funzionante ma il problema sorge se ho piu coppie di squadre con punti uguali
    2 squadre a 10pt
    e 2 squadre a 7pt
    la query avvia la verifica tra le 4 squadre
    ho provato anche il tuo script con la mia query ha lo stesso problema
    stavo cercando di capire come resettare il ciclo quando cambia l'id di ricerca

    L'unico problema può essere se ci sono più di 2 squadre con lo stesso punteggio: in tal caso invece di modificare "2) aggiusti $squadre[$i]['punti']" dovresti aggiungere un ulteriore campo, e poi ordinare (tramite PHP) prima per punti e poi per questo nuovo campo.
    fatto gia questa prova e funziona in modo corretto è bastato aggiungere "," alla fine della variabile $filtro per separare il recordo trovato dopo il secondo ...e poi 0 concatenato nella variabile che passo nella query altrimenti mi dava errore id_squadra1 in (1,2,)

    il tuo codice
    Codice PHP:
    $len = count($squadre); //numero di squadre
    $filtro="";
    for(
    $i = 0; $i < $len - 1; $i++)
    {
    if(
    $squadre[$i]['punti'] == $squadre[$i + 1]['punti'])
    {
    $filtro.= $squadre[$i]['id_squadre']." , ".$squadre[$i + 1]['id_squadre'].",";//<----------

    // 2) aggiusti $squadre[$i]['punti'] a secondo dell'esito (non so quanti punti vadano aggiunti in questi casi)
    }
    }
    grazie ancora per gli aiuti
    Ultima modifica di omgprova : 25-04-2021 alle ore 21.41.23

Regole di scrittura

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