Ciao a tutti, avevo scritto un altro messaggio ma pare che sia riuscito a far funzionare le cose. L'unica cosa è che la query che ho scritto, che dovrebbe comprendere tre tabelle, più alcune operazioni inline, è molto lenta nell'esecuzione (anche se chiedo di limitare i risultati a 10 record - dovrò farlo per 16000 in futuro!!! ).
Questa la query che ho scritto, se servono i dettagli lascio in grigio (anzi in SILVER, come lo chiama vBullettin ) il vecchio posto sotto.
codice:
SELECT `clienti`.`idcliente`, `clienti`.`nome`, AVG( `ordini`.`importo` ) AS `avgmoneyspent`, max(`ordini`.`data`) AS `lastorderdate`, COUNT(`ordini`.`idordine`) AS `numorders`, `postcodes`.`area` AS `FPlist` FROM clienti, ordini, postcodes WHERE `clienti`.`idcliente` = `ordini`.`idcliente` AND `postcodes`.`postcode` = `clienti`.`postcode` GROUP BY `clienti`.`idcliente` ORDER BY `clienti`.`idcliente` DESC LIMIT 0, 10
Inoltre, cosa importante almeno quanto la velocità (lentezza) di esecuzione: se un cliente non ha fatto ordini (cioè se "numorders" = 0), la riga di quel cliente non compare tra i risultati. Perché!?
Qualcuno ha qualche idea per risolvere questi due problemi? O vede qualche errore più o meno palese? O, ancora, ha qualche suggerimento per scrivere la stessa query meglio, eventualmente anche con altre query nested?
Grazie in anticipo ancora!
-Marco
Vecchio post:
Ciao a tutti, ho una nuova sfida. Una query che comprende tre tabelle con campi calcolati al volo. Le tre tabelle sono così:
codice:
CLIENTI
--------------
idcliente
nome
postcode
POSTCODES
--------------
postcode
area
ORDINI
--------------
idordine
idcliente
importo
data
Quello che devo ottenere è un "report" dove figurano, per ogni id cliente (che deve ovviamente comparire una volta sola - in altre parole è quello su cui faccio il GROUP BY):
codice:
idcliente | nome | postcode | area | media(importo degli ordini) | data dell'ultimo ordine | conta(ordini effettuati)
Le cose semplici (linkare clienti e postcode, o calcolare la media degli ordini per ogni cliente, ecc) le ho fatte, ma non ho idea di come recuperare la data dell'ultimo ordine né di come mettere insieme il tutto...
Inoltre, e non capisco il perché - probabilmente ho scritto male la/e query - l'esecuzione è molto lenta anche se lo faccio in locale e per bunch di 10 record per volta.. (per capirci il database clienti è sugli 11mila record e il database ordini sui 16000)
C'è qualche anima pia che mi da qualche dritta please?
Grazie in anticipo,
-Marco
-------
Le query che ho scritto finora, nel caso potessero servire per debugging...
Ottenere nomi dei clienti con la media degli ordini e area di appartenenza: (questa query impiega ad essere completata qualche decina di secondi)
codice:
SELECT `clienti`.`nome`, `clienti`.`idcliente`, `postcodes`.`area`, AVG(`ordini`.`importo`) AS `avgorder` FROM `ordini`, `clienti`, `postcodes` WHERE `ordini`.`idcliente` = `clienti`.`idcliente` AND `postcodes`.`postcode` = `clienti`.`postcode` GROUP BY `idcliente` ORDER BY `idcliente` DESC LIMIT 0, 10
Ottenere gli ordini per un utente, con media e data ultimo ordine: (dovrebbe di fatto essere quella più o meno definitiva ma ci impiega 5 minuti e - ovviamente - fornisce media e data ultimo ordine uguale per ogni cliente! Vedo che è sbagliata ma non so come correggerla!)
codice:
SELECT `clienti`.`idcliente`, `clienti`.`nome`, AVG( `ordini`.`importo` ) as `avgmoneyspent`, max(`ordini`.`data`) FROM clienti, ordini WHERE `ordini`.`idcliente` = `clienti`.`idcliente` GROUP BY `clienti`.`idcliente` ORDER BY `clienti`.`idcliente` DESC LIMIT 0, 10
Forse faccio prima a ripartire da capo!