Suggerimento di costruzione subselect: calcolo tra 2record di stessa tabella
Ciao, è la prima volta che mi affido in parte attiva ad un forum perché non sono riuscito a risolvere questo quesito che mi pare strano non riesca a trovare.
Premetto che è un sito senza fini di lucro ed è solo per accomulare esperienza si tratta di estrarre una query con delle differenze di valori tra record della stessa tabella.
Sicuramente dovrò fare una subselect..
però ci sono dei limiti di elaborazione che mi paiono un po strani per un db come MySQL.
Ovvero il db in questione è popolato da 26000 records troppi, ma questo non dovrebbe inceppare un motore potente con mysql! Quindi mi devo impegnare ad ottimizzare il codice!
Spiego nel dettaglio.
Tabella Players
1. id
2. nome
3. gruppo
Tabella Punti
1. id
2. idplayer
3. classifica
4. valore
5. ora
Praticamente inserisco una intera classifica composta di 550 players e questo avviene ogni ora (o meglio più volte in una giornata)
Una volta inseriti i valori come detto devo estrarre i risultati
dando come filtro orario di inizio e orario di fine: questo dovrà elaborare la differenza dei punti per ogni ora di ogni singolo giocatore di un preciso gruppo a partire come detto dall'ora inidicata fino a quella di chiusura (il gruppo con più player è formato da 50 elementi)
La query l'ho elaborata così:
premetto che le subselect (ORA1,FormatPUNTI,DIFF) sono state elaborate per merito di un ciclo in php facendo un "GROUP BY ora" e tutti i record di questa query hanno dato vita alle subselect sopracitate
SELECT DISTINCT p.nome, p.gruppo, pnt.valore, pnt.ora,
(SELECT pnt1.valore FROM punti AS pnt1 WHERE p.id = pnt1.id_player AND pnt1.inserimento_datatime ='2014-11-03 22:00:00') AS PUNTI1,
(SELECT FORMAT(pnt1.valore, 0) FROM punti AS pnt1 WHERE p.id = pnt1.id_player AND pnt1.inserimento_datatime ='2014-11-03 22:00:00') AS FormatPUNTI1,
(SELECT DATE_FORMAT(pnt1.inserimento_datatime, '%d/%m %h:26') FROM punti AS pnt1 WHERE p.id = pnt1.id_player AND pnt1.inserimento_datatime ='2014-11-03 22:00:00' ) AS ORA1,
(pnt.valore-(SELECT pnt1.valore FROM punti AS pnt1 WHERE p.id = pnt1.id_player AND pnt1.inserimento_datatime ='2014-11-03 22:00:00' )) AS DIFF1,
(SELECT pnt2.valore FROM punti AS pnt2 WHERE p.id = pnt2.id_player AND pnt2.inserimento_datatime ='2014-11-04 04:00:00') AS PUNTI2,
(SELECT FORMAT(pnt2.valore, 0) FROM punti AS pnt2 WHERE p.id = pnt2.id_player AND pnt2.inserimento_datatime ='2014-11-04 04:00:00') AS FormatPUNTI2,
(SELECT DATE_FORMAT(pnt2.inserimento_datatime, '%d/%m %h:26') FROM punti AS pnt2 WHERE p.id = pnt2.id_player AND pnt2.inserimento_datatime ='2014-11-04 04:00:00' ) AS ORA2,
((SELECT pnt1.valore FROM punti AS pnt1 WHERE p.id = pnt1.id_player AND pnt1.inserimento_datatime ='2014-11-03 22:00:00')-(SELECT pnt2.valore FROM punti AS pnt2 WHERE p.id = pnt2.id_player AND pnt2.inserimento_datatime ='2014-11-04 04:00:00' )) AS DIFF2
FROM punti AS pnt INNER JOIN players AS p ON p.id = pnt.id_player WHERE p.gruppo = 'ALCOL' GROUP BY p.nome ORDER BY p.nome DESC
TEMPO DI ELABORAZIONE 1000secondi > 15min!
o devo creare delle tabelle ad ogni inserimento di classifica oppure devo imparere meglio a creare una subselect, se è il secondo caso aiutatemi!