Ottimizzazione Query

Max61

Utente Attivo
2 Mar 2014
689
3
18
Salve a tutto gli iscritti del forum, alle solite sono ad affrontare un problema che non so risolvere, mi spiego:
ho 5 giocatori che possono assumere 3 possibili risultati ognuno, <; >; = nei confronti degli altri 4...
1) giocatore1 > giocatore2 and giocatore1 > giocatore3 and giocatore1 > giocatore4 and giocatore1 > giocatore5
e fare il calcolo:
giocatore1 - giocatore2
giocatore1 - giocatore3
giocatore1 - giocatore4
giocatore1 - giocatore5
2) giocatore1 > giocatore2 and giocatore1 > giocatore3 and giocatore1 > giocatore4 and giocatore1 < giocatore5
giocatore1 - giocatore2
giocatore1 - giocatore3
giocatore1 - giocatore4
giocatore1 - giocatore5
3) giocatore1 > giocatore2 and giocatore1 > giocatore3 and giocatore1 > giocatore4 and giocatore1 = giocatore5
giocatore1 - giocatore2
giocatore1 - giocatore3
giocatore1 - giocatore4
giocatore1 - giocatore5
4) giocatore1 > giocatore2 and giocatore1 > giocatore3 and giocatore1 < giocatore4 and giocatore1 > giocatore5
giocatore1 - giocatore2
giocatore1 - giocatore3
giocatore1 - giocatore4
giocatore1 - giocatore5
5) giocatore1 > giocatore2 and giocatore1 > giocatore3 and giocatore1 = giocatore4 and giocatore1 > giocatore5
giocatore1 - giocatore2
giocatore1 - giocatore3
giocatore1 - giocatore4
giocatore1 - giocatore5

e così via per tutte le varie possibilità esistenti...
qualcuno sa ottimizzare la query?
Grazie
Max61
 
Ultima modifica:

macus_adi

Utente Attivo
5 Dic 2017
1.301
86
48
IT/SW
ho 5 giocatori che possono assumere 3 possibili risultati ognuno, <; >; = nei confronti degli altri 4...
Sarebbe meglio presentare il problema in modo appropriato indicando il modello dati...
Mi spiego: la tabella che riceve i dati com'è fatta? Gestione orizzontale, verticale, json?
Se verticale il vincolo d'integrità a chi fa riferimento? alla mano giocata o all'intera giocata?


e fare il calcolo:
giocatore1 - giocatore2
giocatore1 - giocatore3
giocatore1 - giocatore4
giocatore1 - giocatore5
Mi sembrano tutti uguali... Matematicamente (giocatoreX-giocatoreY]?
Sembrerebbe tu stia chiedendo delle permutazione, con annessi calcoli...

qualcuno sa ottimizzare la query?
Per far questo devi dare maggiori info...

Altra nota... Un Service per il calcolo?
 

Max61

Utente Attivo
2 Mar 2014
689
3
18
Ciao macus_adi grazie.
Provo a spiegarmi: ad ogni smazzata inserisco un record facendo le somme per riga.
Una volta arrivati al punteggio massimo inserisco il record con il calcolo del punteggio massimo raggiunto da ogni giocatore in un altra tabella dove vorrei fare i calcoli riepilogativi sottraendo al giocatore che ha fatto più punti il punteggio degli altri.

Con la speranza di essermi spiegato...
 

macus_adi

Utente Attivo
5 Dic 2017
1.301
86
48
IT/SW
QUindi la riga con id=4 rappresenta una smazzata o un'intera giocata?
Coppia cos'è?
Non sto chiedendo un UML di classi, semplicemente rappresenta il problema, veramente non ho capito (il gioco di burraco non lo conosco)...
Non so se è lecito, ma se ci fossere più di 4 giocatori, come fai???
La tabella in allegato, senza dovuta rappresentazione in linguaggio naturale non ha senso (almeno per me)...

Provo a spiegarmi: ad ogni smazzata inserisco un record facendo le somme per riga.
É questo il caso?
Se così fosse, l'entry è completamente sbagliato, stai sfruttando l'iteratività di php senza ottimizzare con il DBMS, il che è un grave errore di logica.

Prendi con le pinze quello che ti sto dicendo in quanto non CONOSCO il gioco, e NON HO CAPITO cosa intendi!!!

Saresti in grado di allegare un'img con i join presenti nel db (solo tabelle interessate al tuo problema) con commenti in modo da far capire cosa vorresti fare?

e fare il calcolo
Se invece necessiti solo ed esclusivamente delle permutazioni possibili potresti dare i vincoli di punteggio (ripeto non conosco il gioco), e soprattutto il confronto è valido per (nX-nY]??
 

Max61

Utente Attivo
2 Mar 2014
689
3
18
Ciao macus_adi grazie, provo a spiegare le mie intenzioni: di solito una partita a burraco è fatta da 4 giocatori che fanno 4 smazzate e vince la coppia che fa il punteggio maggiore sottraendo al punteggio maggiore quello minore, il valore che trovato va confrontato con uno score ufficiale che allego.
Es.: coppia1 fa 2000 punti; coppia2 ne fa 1500; differenza 500, secondo lo score alla coppia1 viene assegnato 15 e alla coppia perdente 5. E si continua a giocare contro altre coppie per 4 volte. La somma dei punti dello score di ogni coppia darà la coppia vincitrice.
Detto questo vado al mio problema:
siccome giochiamo tra amici e a volte siamo 4, a volte 5, a volte 6 e per giocare comunque tutti indipendentemente dalle regole ufficiali ci siamo inventati che di volta in volta un giocatore gioca a solo e gli altri formano le coppie.
In una prima tabella inserisco i punteggi di ognuno.
Alla fine delle smazzate inserisco i punteggi totali nella tabella che ho allegato ieri e qui vorrei calcolare automaticamente quello che ho scritto sopra: coppia1 fa 2000 punti; coppia2 ne fa 1500; differenza 500, secondo lo score alla coppia1 viene assegnato 15 e alla coppia perdente 5.
Allego codice che ho utilizzato per fare questi calcoli
PHP:
echo '<td>' . mysql_result($result, $i, 'coppia1') . '</td>';
               echo '<td>' . mysql_result($result, $i, 'max_punti_coppia1') . '</td>';
         
               if (mysql_result($result, $i, 'max_punti_coppia1') > mysql_result($result, $i, 'max_punti_coppia2')|| mysql_result($result, $i, 'max_punti_coppia1') > mysql_result($result, $i, 'max_punti_coppia3') || mysql_result($result, $i, 'max_punti_coppia1') > mysql_result($result, $i, 'max_punti_coppia4') || mysql_result($result, $i, 'max_punti_coppia1') > mysql_result($result, $i, 'max_punti_coppia5')){
                echo '<td>' . (mysql_result($result, $i, 'max_punti_coppia1') - mysql_result($result, $i, 'max_punti_coppia1')) . '</td>';
                $score = (mysql_result($result, $i, 'max_punti_coppia1') - mysql_result($result, $i, 'max_punti_coppia1'));
          
            if ($score == 0 ){
                echo '<td>Vincitore (10-10)</td>';
            } elseif ($score >= 0 && $score <= 40){
                echo '<td>Punteggio: 10-10</td>';             
            } elseif ($score >= 41 && $score <= 120){
                echo '<td>Punteggio: 11-9</td>';
            } elseif ($score >= 121 && $score <= 200){
                echo '<td>Punteggio: 12-8</td>';
            } elseif ($score >= 201 && $score <= 300){
                echo '<td>Punteggio: 13-7</td>';
            } elseif ($score >= 301 && $score <= 400){
                echo '<td>Punteggio: 14-6</td>';
            } elseif ($score >= 401 && $score <= 500){
                echo '<td>Punteggio: 15-5</td>';
            } elseif ($score >= 501 && $score <= 620){
                echo '<td>Punteggio: 16-4</td>';
            } elseif ($score >= 621 && $score <= 740){
                echo '<td>Punteggio: 17-3</td>';
            } elseif ($score >= 741 && $score <= 870){
                echo '<td>Punteggio: 18-2</td>';
            } elseif ($score >= 871 && $score <= 1000){
                echo '<td>Punteggio: 19-1</td>';
            } elseif ($score >= 1000){
                echo '<td>Punteggio: 20-0</td>';
            }
allego risultato ottenuto con il codice utilizzato
Risultato_ottenuto.jpg
Il problema sta nell'ottimizzare questa query
PHP:
               if (mysql_result($result, $i, 'max_punti_coppia1') > mysql_result($result, $i, 'max_punti_coppia2')|| mysql_result($result, $i, 'max_punti_coppia1') > mysql_result($result, $i, 'max_punti_coppia3') || mysql_result($result, $i, 'max_punti_coppia1') > mysql_result($result, $i, 'max_punti_coppia4') || mysql_result($result, $i, 'max_punti_coppia1') > mysql_result($result, $i, 'max_punti_coppia5')){
                echo '<td>' . (mysql_result($result, $i, 'max_punti_coppia1') - mysql_result($result, $i, 'max_punti_coppia1')) . '</td>';
                $score = (mysql_result($result, $i, 'max_punti_coppia1') - mysql_result($result, $i, 'max_punti_coppia1'));
perchè ogni coppia può avere 3 risultati possibili rispetto alle altre: vincente, perdente e pari, quindi le possibilità sono tantissime e mi servirebbe una query ad hoc che comprenda tutti i risultati possibili.
Con la speranza di essermi spiegato...
Allego score
burraco_score.jpg

Grazie
Max61
 
Ultima modifica:

macus_adi

Utente Attivo
5 Dic 2017
1.301
86
48
IT/SW
Es.: coppia1 fa 2000 punti; coppia2 ne fa 1500; differenza 500, secondo lo score alla coppia1 viene assegnato 15 e alla coppia perdente 5. E si continua a giocare contro altre coppie per 4 volte. La somma dei punti dello score di ogni coppia darà la coppia vincitrice.
Capito.... Per prima cosa elimina tutti gli IF che sono orrendi e utilizza una funzione/metodo/helper/service per creare la tua logica...
Da li hai finito praticamente il giro....

https://gist.github.com/fabiocicerchia/4556892 per le permutazioni
 

Max61

Utente Attivo
2 Mar 2014
689
3
18
Grazie...ma per le mie conoscenze informatiche è troppo complicato.
Max61