Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Query di tre tabelle più operazioni inline

    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!
    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

  2. #2
    up
    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

  3. #3
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    fatti spostare nella parte sql del forum, la lentezza della query non centra con php

  4. #4
    Uuuups. Hai ragione, non so perché sono andato dritto sul forum php e ho postato convinto che fosse il posto giusto... Mea culpa, sarà l'abitudine!

    Chiedo scusa... Posso chiedere a qualche moderatore di spostare questo topic perfavore?
    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.