[PHP - MySQL] - Raggruppare risultati per data

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
LucaZPF
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 373
Iscrizione: lunedì 8 settembre 2008, 0:14
Località: Umma gumma
Contatti:

[PHP - MySQL] - Raggruppare risultati per data

Messaggio da LucaZPF »

Ciao a tutti,
ho realizzato una sorta di agenda in PHP che, collegandosi ad un DB MySQL, mostra una serie di appuntamenti, ordinati per data e ora.

La struttura della tabella agenda è questa:
id | data | ora | num | oggetto
e altre colonne che non interessano al problema. Con questa query, vengono mostrati tutti gli appuntamenti ordinati per data e ora all'interno di una tabella HTML

Codice: Seleziona tutto

SELECT * FROM `agenda` ORDER BY data DESC, ora DESC, num DESC
Ora vorrei creare, per una più facile comprensione, una tabella per ogni data. Agenda di oggi, del 15/09/2022, del 16/09/2022 e così via. Per farlo ho pensato di estrarre tutte le singole date con questa query:

Codice: Seleziona tutto

SELECT DISTINCT `data` FROM agenda ORDER BY `data` DESC LIMIT 0,14
E qui mi fermo, non riesco ad "usare" le date che estraggo correttamente per poi usarle come clausola WHERE in questa query:

Codice: Seleziona tutto

SELECT * FROM `agenda` WHERE (`data` = '$data') ORDER BY `ora` ASC
Spero di essere stato chiaro
grazie a chi mi aiuterà
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2872
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: [PHP - MySQL] - Raggruppare risultati per data

Messaggio da DoctorStrange »

Partiamo dal presupposto che l'estrazione dei dati da una base dati, soprattutto se questa deve servire un web server, deve essere il piu possibile efficiente. Questo vuol dire che devi implementare alcune procedure di "best effort", ovvero che ti garantiscano una resa migliore. Prima di tutte: evitare per quanto possibile il costrutto "select * ". non perchè questo sia sintatticamente scorretto, ma perche è terribilmente poco efficiente, puoi leggere ad esempio, uno tra mille.

In pratica, mettendoti nel "worst case", quando i record aumenteranno, le performance degraderanno sempre di piu.

L'idea qui è di realizzare una piccola UDF (user defined function) tipica di MySQL, oppure usare una delle funzioni già integrate nel linguaggio per convertire le tue date in epoch. In questo modo, le date non saranno altro che una stringa numerica, e la selezione sulle stringhe numeriche è estremamente piu veloce ed affidabile, rispetto ai filtri sulle stringhe.

Oltre a questo, visto che già sai che le tue procedure saranno interessate ad uno specifico estratto dei dati, puoi prevedere di implementare già da subito una tabella che sia partizionata (PARTIOTIONED BY) e poi specificare il campo di partizionamento, nel tuo caso, la marcatura temporale. Puoi in alternativa prevedere la creazione di una view già ordinata sui campi che ti interessano, e poi la potrai materializzare solo in caso di necessità.

Considera inoltre che nelle tue query hai usato i costrutti che sono, in assoluto i piu "impegnativi" in termini di risorse. Ad esempio la "order by", per giunta su campi combinati, rischia di rallentare l'intero sito. Consiglio a questo punto, di sviluppare tabelle distinte, estrarre i campi da diverse tabelle e poi fare una "INNER LEFT JOIN" su campi che sono già stati filtrati dalle tabelle. Tendenzialmente vale il concetto che combinare (con join) campi già filtrati, provenienti da tabelle diverse e distinte, è piu efficiente che estrarre i medesimi dati da un'unica tabella generalista. Non dimenticare che l'engine del DB dovrà scorrere uno dopo l'altro ogni singolo record appartenente alla tabella, per completare.

Un ultimo appunto. La WHERE condition va applicata PRIMA della clausola LIMIT. Questo perche, la where condition limita realmente il numero di campi letti, ovvero l'engine farà un fetch preliminare del record, se questo rispetta la where condition, allora viene aggiunto all'output, altrimenti viene ignorato. La Limit invece prende TUTTI i record, e poi visualizza semplicemente quelli specificati. E' quindi meglio usare prima la where perche alleggerisce e rende molto piu veloce la query.

Il primo consiglio comunque, visto che hai ancora le tabelle (presumibilmente) quasi vuote, è di sviluppare la funzione per convertire le date in epoch, oppure di cercare la funzione già fatta su mysql stesso. Poi potrai ottimizzare tabelle e query.
Ultima modifica di DoctorStrange il mercoledì 14 settembre 2022, 15:58, modificato 1 volta in totale.
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 371
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: [PHP - MySQL] - Raggruppare risultati per data

Messaggio da Lucio C »

Non capisco bene l'uso di tutti quegli apici `` '' ... io di solito in mysql non metto mai apici attorno a nomi di tabelle o colonne.
Inoltre non capisco $data (a meno che sia un php-ismo ... io uso mysql o da line mode client, o da shell script o da java)

Le quantita' data e ora sono definite di uno dei tipi "temporali" ( DATE, TIME, DATETIME, TIMESTAMP) ?
Tali tipi hanno una rappresentazione interna e una visualizzazione "umana" e delle apposite funzioni per operare su di esse.
Consiglio la lettura di un manuale online di mysql come https://dev.mysql.com/doc/refman/8.0/en ... types.html https://dev.mysql.com/doc/refman/8.0/en ... tions.html
The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. (G.B. Shaw)
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2872
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: [PHP - MySQL] - Raggruppare risultati per data

Messaggio da DoctorStrange »

data ora ed agenda sono circondati da caratteri di "quoting forte". Impediscono l'eventuale sostituzione di questi valori, con ipotetiche variabili.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 14 ospiti