MySQL Forums
Forum List  »  Italian

Suggerimento di costruzione subselect: calcolo tra 2record di stessa tabella
Posted by: Salvatore Campagna
Date: November 08, 2014 10:51AM

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!

Options: ReplyQuote


Subject
Views
Written By
Posted
Suggerimento di costruzione subselect: calcolo tra 2record di stessa tabella
2118
November 08, 2014 10:51AM


Sorry, you can't reply to this topic. It has been closed.

Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.