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.
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é!?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
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ì:
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:CLIENTI -------------- idcliente nome postcode POSTCODES -------------- postcode area ORDINI -------------- idordine idcliente importo data
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...codice:idcliente | nome | postcode | area | media(importo degli ordini) | data dell'ultimo ordine | conta(ordini effettuati)
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)
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!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, 10Vedo 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!

).
) il vecchio posto sotto.
Vedo che è sbagliata ma non so come correggerla!)
Rispondi quotando