Newsgroup: it.comp.www.php
Titolo: Ordinamento complicato

Sono agli inizi quindi abbiate pazienza. Dall'interazione di quattro campi
presenti in un db di mysql ricavo con una funzione che ho creato
appositamente in php una data di scadenza. Va tutto bene solo che quando
estraggo i records non li posso ordinare per data di scadenza poiche' quando
faccio il select quel campo non esiste ancora. Ho trovato un sotterfugio ma
volevo un consiglio serio da qualcuno esperto. Grazie a tutti.

Potresti spiegare meglio il contenuto di questi quattro campi qual'e' ?



// detto cosě č un po' vago, comunque...
// invece di stampare direttamente i record estratti fatti un array:
// per ogni valore di $dati fai ciň che va fatto:
while($RS=mysql_fetch_assoc($tua_query)){
	$dati[]=tua_funzione($RS['data_scadenza']);
}
a questo punto fai un sort($dati) o altra funzione di ordinamento array
ciao marcello

 ha scritto nel messaggio
news:yrspc.263425$rM4.11...@news4.tin.it...

L'avevo evitato solo per semplificare ma sintetizzando diciamo che ho due
campi : tipo e datainizio.
Se tipo e' appello :la datascadenza = datainizio +60 giorni se tipo e'
sentenza la datascadenza e' datainizio+un anno.
Il problema e' che in entrambi i conteggi se capita il periodo 1/8 15/9 va
saltato come se nel conteggio non apparisse.
Esempio tipo =sentenza datainizio =1/1/2000 datascadenza =16/2/2001. Grazie

 ciao marcello
Ti ringrazio per la risposta, provo ad applicarla perche' non sono sicuro di
saperlo fare e poi magari se non riesco mi sa che chiedero' di nuovo la tua
disponibilita'. Grazie

 Esempio tipo =sentenza datainizio =1/1/2000 datascadenza =16/2/2001.
Grazie
La soluzione furba è risolvere l'algoritmo facendolo fare al database
utilizzando una query opportuna.
Le strutture per il controllo del flusso sono supportate persino da MySQL
quindi qualunque DBMS usi dovresti avere tali strumenti.
Sono infatti pronto a scommettere che qualunque database usi sia più
efficiente un ordinamento a livello DBMS che non un ordinamento a livello
PHP.
Esemplifichiamo usando una tabella test(id, ini, tip) così definita:
id --> chiave intera autoincrementale
ini -->data
tip --> enum('appello','sentenza')
l'algoritmo prevede l'ordinamento per la data di scadenza così calcolata:
se tip='appello' scad= ini + 2 mesi
se tip='sentenza' scad= ini + 1 anno
la select MySQL dovrebbe essere una cosa di questo tipo
SELECT ini, tip, IF(tip='appello', DATE_ADD(ini, INTERVAL 2 MONTH),
DATE_ADD(ini, INTERVAL 1 YEAR) ) as scad FROM test ORDER BY scad;
Non l'ho verificata ma dovrebbe funzionare. Da questo esempio dovrebbe
essere semplice tradurla nell' SQL del tuo DBMS.
Se non riesci a capirla suggerisco la lettura di un buon libro di SQL prima
di continuare con il tuo progetto.
Ogni minuto speso a leggere libri si traduce in ore risparmiate dal
correggere gli errori.

 spiegato meglio. Grazie
Ok.
In SQL si può fare usando la CASE WHEN THEN costruction e le complete
funzioni per la gestione di date.
Ammetto però che non è semplicissimo, si tratta di gestire 2 CASE per le
sentenze (caso in cui ci entri una volta e caso in cui ci entri 2 volte) e
altri 2 CASE per gli appelli (caso in cui non ci entri e caso in cui ci
entri), ciascun CASE con una condizione WHEN composta da tre clausole
connesse con AND (una verifica su tip e due verifiche sulla posizione della
data di inizio nel calendario), più altri due CASE se vuoi anche gestire il
caso in cui la data iniziale sia all'interno del periodo morto.
Se vuoi seguire questa strada guardati questo:
http://dev.mysql.com/doc/mysql/en/Control_flow_functions.html
in particolare la struttura CASE WHEN THEN e quest'altro:
http://dev.mysql.com/doc/mysql/en/Date_and_time_functions.html
in particolare DATE_ADD() e DATEDIFF()
Però ammetto che se non hai dimestichezza con l'SQL la query diventa in
fretta abbastanza confusa.