Visualizzazione risultati 1 fino 16 di 16

Discussione: Ottimizzare script

  1. #1
    Guest

    Predefinito Ottimizzare script

    ciao, mi sapreste dire se è possibile compattare ottimizzando lo scipt magari riducendo il numero di query?

    Codice PHP:
    $query = "SELECT count(*) from aoe";
    $query1= "SELECT count(*) from aoe WHERE tipo=1";
    $query2= "SELECT count(*) from aoe WHERE tipo=2";
    $query3= "SELECT count(*) from aoe WHERE tipo=3";
    $query = mysql_query ($query, $conn);
    $query1 = mysql_query ($query1, $conn);
    $query2= mysql_query ($query2, $conn);
    $query3 = mysql_query ($query3, $conn);
    $contatore = mysql_result($query, 0);
    $contatore1 = mysql_result($query1, 0);
    $contatore2 = mysql_result($query2, 0);
    $contatore3 = mysql_result($query3, 0);
    echo
    "#File presenti: <b>".$contatore."</b>";
    echo
    "<br>";
    echo
    "#Scenari: <b>".$contatore1."</b> #Campagne: <b>".$contatore2."</b> #Altri file: <b>".$contatore3."</b>";
    grazie

  2. #2
    Guest

    Predefinito

    Prova così:
    Codice PHP:
    $query = "SELECT * from aoe";
    $query = mysql_query ($query, $conn);
    $result = mysql_fetch_array();
    foreach(
    $result as $v){
    $c1 = 0;
    $c2 = 0;
    $c3 = 0;
    if(
    $v['tipo'] == '1'){
    $c1++;
    }
    if(
    $v['tipo'] == '2'){
    $c2++;
    }
    if(
    $v['tipo'] == '3'){
    $c3++;
    }
    }
    $c1 dovrebbe contentere il numero dei risultati dove tipo è 1, $c2 quelli dove è 2 e $c3 quelli dove è 3.

  3. #3
    Guest

    Predefinito

    $query="SELECT * FROM aoe";
    $contatore=mysql_query($query);
    $contatore_1=0;
    $contatore_2=0;
    $contatore_3=0;
    while($arr=mysql_fetch_assoc($contatore)){
    if($arr['tipo']=="1"){
    $contatore_1++;
    }else if($arr['tipo']=="2"){
    $contatore_2++;
    }else if($arr['tipo']=="3"){
    $contatore_3++;
    }
    }

    Per sapere i record totali basta sommare le 3 var ;)


    Ciaoooo!!!!

  4. #4
    Guest

    Predefinito

    così fa solo una query vero?

  5. #5
    L'avatar di funcool
    funcool non è connesso Utente storico
    Data registrazione
    05-02-2004
    Residenza
    Qui... Non lì, qui!
    Messaggi
    15,433

    Predefinito

    Citazione Originalmente inviato da lsdforum
    così fa solo una query vero?
    Sì, fa solo una query dove estrae tutti gli elementi della tabella.
    Mattia vi manda a FunCool - Matriz - Directory Gogol - Sfondo rosso per la Birmania
    «Tu mi dai fastidio perché ti credi tanto un Dio!» «Bè, dovrò pur prendere un modello a cui ispirarmi, no?» Woody Allen

  6. #6
    Guest

    Predefinito

    A mio modesto modo di vedere le cose nessuna delle due soluzioni sono "ottimizzate":
    la prima per il numero di query
    la seconda per gli if che sono dentro il ciclo.


    partire da una query del genere è troppo complicato?
    Codice PHP:
    SELECT tipo, count(*)
    from aoe
    group by tipo
    Ciao

  7. #7
    Guest

    Predefinito

    golfox, a parte che quella postata da me e da tuttoeniente2 sono la stessa cosa (una sola query), ma non vedo dove sia il problema se sono presenti degli if dentro il ciclo.
    Cmq quella è la prima cosa che mi è venuta in mente, usare le JOIN in questo caso (a parte non so quanto sia utile) non sarebbe molto indicato.
    Invece il tuo suggerimento, per come è ora, non ha molto significato, perchè di fatto non risolve la questione posta da lsdforum ;)
    Prova (cogliendo l'occasione per approfondire il linguaggio SQL) a spiegare come vorresti continuare la tua soluzione, magari esce fuori qualcosa di interessante.


    Ciaooo!!!

  8. #8
    Guest

    Predefinito

    Eccoti accontantato:

    ---------------------------
    $query = "SELECT tipo, count(*) num
    from aoe
    group by tipo";

    $cursor = mysql_query($query) or die (mysql_error());
    if (mysql_num_rows($cursor)){
    $contatore = 0;
    while ($result = mysql_fetch_array($cursor)) {
    $var = $result['tipo'];
    $val = $result['num'];
    $contatore += $val;
    ${'contatore'.$var} = $val;
    }
    }
    else {
    ## messaggio che non ha trovato niente
    ## ed eventuale inizializzazione delle variabili per la stampa
    }
    -----------------------------------

    Qualche precisazione:
    1. il codice l'ho provato al lavoro (php5/Oracle) e non ho tempo di provarlo ora su Altervista per cui se c'è qualcosa che non và mettetelo pure a posto (sarà roba da poco).
    2. Le query alle quali mi riferivo erano la prima (quella di lsdforum) e la tua/tuttoeniente2.... ho comunque espresso male il concetto nel mio primo post di questa discussione.
    3. quando si parla di "ottimizzazione" non vuol dire solo mettere a posto le query ma fare un codice che riduca la complessità "di calcolo" del programma e sotto questo punto di vista funziona decisamente meglio il programma di lsdforum piuttosto che il vostro.

    Vado di fretta.... scusatemi

    Ciao
    Ultima modifica di golfox : 16-03-2006 alle ore 20.35.27 Motivo: mi sono spiegato male al punto 2

  9. #9
    Guest

    Predefinito

    mmmm l'unica cosa che non mi convince è questa riga:
    ${'contatore'.$var} = $val;
    Forse è una forma usabile con in php5, non *penso* col 4 funzioni... o almeno io non la conosco! :P
    Da quanto ho capito crea una sorta (o un vero e proprio) vettore che ha come indice il tipo il quale aumenta di una unità pre ogni record di quel tipo.

    Per quanto riguarda l'ottimizzazione, già che si usi 4 query al posto di una è da escludere quella soluzione!
    Inoltre, sempre per quanto detto poco sopra, il fatto di costruire 3 vettori (uno per ogni tipo) dentro un ciclo non mi pare una soluzione "più ottimizzata" di quella mia.

    Pronto ad essere smentito ;)


    Ciaoooooo!!!!!!!!

  10. #10
    L'avatar di heracleum
    heracleum non è connesso Utente storico
    Data registrazione
    21-01-2004
    Messaggi
    3,333

    Predefinito

    debug:
    La valutazione del nome di una variabile funziona anche in php4, confermo.
    ${espressione} quel che ritorna l'espressione dentro le graffe viene utilizzata come nome variabile.
    Quindi alla fine dello script, per printare i risultati, ti trovi valorizzate:
    $contatore1, $contatore2, $contatore3
    (certo uno deve sapere i propri valori del campo 'tipo' altrimenti i nomi delle variabili dichiarate rimangono un'incognita diciamo che avrei utilizzato personalmente un "comodoso" array ghghgh)

    golfox:
    complimenti, sia lo script che la query mi sembrano oltremodo ottimizzate. Almeno personalmente non vedo come fare per ridurre ulteriormente..
    Sicuramente fetchare ogni record tirandosi giù tutta la tabella e contarli uno ad uno via php non è il top ;)
    Le statistiche sempre meglio farle fare alle query stesse.
    Avvertimento: richiedere in privato questioni tecniche produrrà inevitabilmente una supercazzola prematurata come risposta. (5 served)

  11. #11
    Guest

    Predefinito

    Vedi, c'è sempre da imparare! ;)

    Cmq sia usare group by è la soluzione migliore (purtroppo le prime cose che mi vengono in mente non sono sempre le migliori! ...come disse cicciolina...)

    Notte ;)


    Ciaooooo!!!!!!

  12. #12
    Guest

    Predefinito

    Credo sia opportuna una breve risposta riguardo a quello che avete scritto.
    Sono partito da quello che ha già scritto lsdforum cercando di cambiare il suo codice il meno possibile e per me, in questo caso, cambiare il meno possibile vuol dire tenere almeno gli echo del suo script.

    Hai ragione heracleum gli array sono preferibili e condivido tutte le tue considerazioni (conoscenza a priori del valore del campo tipo), ma in questo caso ho preferito assecondare le scelte di lsdforum: è meglio che se ne accorga da solo dei limiti della sua scelta.
    Per come è stato scritto il mio codice l'unica cosa che si può fare è inizializzare le variabili
    Codice PHP:
    $contatore = $contatore1= $contatore2 = $contatore3 = 0;
    per poi lasciare al ciclo la giusta valorizzazione delle variabili stesse ed evitare
    Codice PHP:
    if (mysql_num_rows($cursor)){....
    }
    ma queste sono scelte di programmazione che se seguono una logica risultano comunque ottimizzate.

    Debug: nulla da dire sulla scelta che è sicuramente meglio fare una query piuttosto che 4; sotto questo punto funziona decisamente meglio la tua soluzione piuttosto che quella di lsdforum, ma se si vuole essere rigorosi bisogna evitare, se si può, di eseguire degli if nei cicli.... un giorno ti spiegherò il perché ;-)

    Ciao, Golfox

  13. #13
    Guest

    Predefinito

    Ciao!
    Utilizzo questo thread perchè l'argomentazione è la stessa, almeno si evitano decine di thread fotocopia. :D

    Io sto scrivendo questo 'script' per aggiungere le statistiche al mio sito: numero iscritti, quanti son maschi, quante femmine e cavolate varie... :P

    Codice PHP:
    <?PHP
    session_start
    ();
    include
    "config.inc.php";

    //Inizio conteggio record
    $strsql = "SELECT COUNT(ID_ONLINE) AS TOTALE_COL FROM ONLINE";
    $querysql = mysql_query($strsql,$connessione) or die(mysql_error());
    $row = mysql_fetch_array($querysql); {
    $TOTALE_ONLINE = $row["TOTALE_COL"]; }
    //Fine conteggio record
    ?>


    <?PHP
    //Inizio conteggio record
    $strsql = "SELECT COUNT(SESSO) AS TOTALE_COL FROM USERS WHERE SESSO LIKE 'Maschio'";
    $querysql = mysql_query($strsql,$connessione) or die(mysql_error());
    $row = mysql_fetch_array($querysql); {
    $TOTALE_MASCHI = $row["TOTALE_COL"]; }
    //Fine conteggio record
    ?>

    <?PHP
    //Inizio conteggio record
    $strsql = "SELECT COUNT(SESSO) AS TOTALE_COL FROM USERS WHERE SESSO LIKE 'Femmina'";
    $querysql = mysql_query($strsql,$connessione) or die(mysql_error());
    $row = mysql_fetch_array($querysql); {
    $TOTALE_FEMMINE = $row["TOTALE_COL"]; }
    //Fine conteggio record
    ?>

    <?PHP
    //Inizio conteggio record
    $strsql = "SELECT COUNT(USERNAME) AS TOTALE_COL FROM USERS";
    $querysql = mysql_query($strsql,$connessione) or die(mysql_error());
    $row = mysql_fetch_array($querysql); {
    $TOTALE_USERNAME = $row["TOTALE_COL"]; }
    //Fine conteggio record
    ?>
    Però messa cosi ogni statistica è una query ed attualmente son già 4 e nel caso volessi aggiungerne altre (cosi per sfizio :P ) risulterebbe essere 'ingestibile' anche solo testare il sito (fino a quando non sarà pronto) con la semplice 'classe 1'.


    Consigli? :P

  14. #14
    L'avatar di heracleum
    heracleum non è connesso Utente storico
    Data registrazione
    21-01-2004
    Messaggi
    3,333

    Predefinito

    Dandoti ragione sul fatto che l'argomentazione è la stessa.. mi chiedo come mai la lettura della soluzione data non ti abbia già suggerito la risposta al tuo quesito
    Cioè usa anche tu il GROUP BY SESSO no? (so che suona piuttosto "orgiastico" ma la soluzione quella è, come per il problema di cui al topic )

    Ovvero, quantomeno puoi ridurre ad un totale di DUE query, una per tabella.
    La prima query lasciala uguale visto che pesca da online.
    Le altre tre le risolvi in UNA sola come suggerito sopra.

    Codice PHP:
    $query = "SELECT SESSO, count(SESSO) num
    from USERS group by SESSO"
    ;

    $cursor = mysql_query($query) or die (mysql_error());
    if (
    mysql_num_rows($cursor)){
    $totale = 0;
    while (
    $result = mysql_fetch_array($cursor)) {
    $var = $result['SESSO'];
    $val = $result['num'];
    $totale += $val;
    ${
    'totale_'.$var} = $val;
    }
    }
    Alla fine avrai le seguenti variabili valorizzate:
    $totale = totale utenti misti
    $totale_Maschio = totale maschi
    $totale_Femmina = totale femmine

    dai, non per essere noioso.. ma non ci voleva tantissimo a tradurlo per il tuo caso ;)
    Avvertimento: richiedere in privato questioni tecniche produrrà inevitabilmente una supercazzola prematurata come risposta. (5 served)

  15. #15
    Guest

    Predefinito

    Heracleum, c'avevo pensato infatti.. :P
    ma avevo pensato appunto al fatto che una delle quattro query andasse a pescare da online e quindi non credevo di poterla inserire inserire insieme alle altre (ed appunto le query da 4 scendevano a 2), ma volevo appunto "scoprire" se ci fosse un metodo che io non vedevo per raggruppare anche gli online con le altre e quindi da 2 farne 1 :D

    Ma è ottimo già cosi, grazie ;)

  16. #16
    L'avatar di heracleum
    heracleum non è connesso Utente storico
    Data registrazione
    21-01-2004
    Messaggi
    3,333

    Predefinito

    Sì avevo immaginato,
    non saprei, la mia limitata conoscenza di sql mi dice che lo vedo maluccio l'incastro mettendo in mezzo anche un'altra tabella.. ma chissà forse debug e golfox o chi per loro...
    Avvertimento: richiedere in privato questioni tecniche produrrà inevitabilmente una supercazzola prematurata come risposta. (5 served)

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •