Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Query per più risultati

    ciao a tutti.

    avrei la necessità di ottenere un output del genere Totale Conferme: 100/1000
    cioè: su 1000 richieste che provengono da un dato canale di vendita, 100 sono state portate a termine.

    Siccome questa procedura deve ripetersi per diversi canali di vendita, mi chiedevo se posso sintetizzare la query in un qualche modo o ne devo per forza produrre due per ogni canale.
    Esempio:
    Codice PHP:
    //ottengo il totale delle richieste per un dato canale
    $query "SELECT * FROM contatti WHERE provenienza='3'";
    $result mysql_query($query) or die (mysql_error());
    $quota $num_rows mysql_num_rows($result);

    //ottengo solo le conferme per quel dato canale
    $query "SELECT * FROM contatti WHERE provenienza='3' AND stato='3'";
    $result4 mysql_query($query) or die (mysql_error());
    $quota4 $num_rows mysql_num_rows($result4);

    echo 
    "Totale Conferme: ".$quota4."/".$quota
    ---------------------------
    danielix05

  2. #2
    non penso, comunque se ti serve solo il totale ti consiglio di usare select count(*) (e quindi mysql_result()) e non select *.

    dal tuo esempio, se la tabella contiene 20milioni di record, ogni volta ne estrai dai 20 ai 40 milioni.. con il count(*) ti limiti a 2.

  3. #3

    in questo modo?

    intendevi dire qualcosa del genere?
    Codice PHP:
    $mysqlc->query("SELECT COUNT(id) AS conferme FROM contatti WHERE stato='3';");
    $result2 mysql_fetch_array($mysqlc->resultMYSQL_ASSOC);
    $quota_tot_conf $result2['conferme']; 
    in questo modo siamo più veloci?
    ---------------------------
    danielix05

  4. #4

    Re: in questo modo?

    Originariamente inviato da danielix05
    intendevi dire qualcosa del genere?
    Codice PHP:
    $mysqlc->query("SELECT COUNT(id) AS conferme FROM contatti WHERE stato='3';");
    $result2 mysql_fetch_array($mysqlc->resultMYSQL_ASSOC);
    $quota_tot_conf $result2['conferme']; 
    in questo modo siamo più veloci?
    Codice PHP:
    $query "SELECT count(*) FROM contatti WHERE provenienza='3'";
    $result mysql_query($query) or die (mysql_error());
    $quota mysql_result($result,0,0); 

  5. #5

    tre domande

    1. In questo modo, come mi dicevi, anziché estrarre 40 milioni di record ne estraiamo solo quelli necessari? tipo 93... ?

    2. invece di scrivere COUNT(*) posso scrivere COUNT(ID)? non dovremmo essere più veloci ancora?

    3. per ottenere il totale per canale di vendita, insieme alla query che mi hai suggerito, devo metterne un'altra come questa...
    Codice PHP:
    $query "SELECT COUNT(id) FROM contatti WHERE provenienza='1';";
    $result mysql_query($query) or die (mysql_error());
    $quota_tot_dirette mysql_result($result,0,0); 
    ...quindi avrò due query per ogni canale di vendita. Esatto?
    :master:
    ---------------------------
    danielix05

  6. #6
    1 - no, ti estrae soltanto 1 record che ti dice il totale. Ovviamente visto che a te servono due totali, con due query avrai due record.

    2 - si, usa pure count(nomeCampo), è piu veloce

    3 - si, in questa soluzione avrai due query per ciascun canale di vendita.
    due query che però ti restituiranno due record, non 1 record per ogni riga da conteggiare.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    18
    ... e se si effettuasse una sola select con group by ????

    Codice PHP:
    SELECT count(B.stato) as totConfermecount(A.provenienza) as totRichieste
      FROM  contatti A
      LEFT  JOIN contatti B ON A
    .id B.id AND B.stato '3'
      
    GROUP BY A.provenienza 
    ... si dovrebbe ottenere come result set una riga per ogni canale di vendita con i due totali :

    Codice PHP:
    totConferme totRichieste
            100    1000
            200     800 
     etc
    ... 
    ... o ho compreso male ???

  8. #8

    per silver55

    grazie ragazzi per la vostra attenzione.
    silver55 purtroppo non riesco a seguire la logica di quanto hai scritto.

    Cosa rappresenta A e B???

    ho provato a eseguire la query ma mi porta risultati = a 0

    mi spieghi meglio commentando la query che hai scritto?
    ---------------------------
    danielix05

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    18
    ... ho immaginato (cosi mi e' sembrato di capire) che ci sia una tabella (contatti) che ha un campo provenienza (canale di vendita) ed un campo stato (della conferma), ed ovviamente un campo rappresentante la Key primaria della tabella :

    Codice PHP:
    id provenienza stato 
    1    1           3
    2    1           3
    3    1           3
    5    1           1
    6    1           3
    7    1           3
    8    2           3
    9    2           3
    10   2           1
    11   2           3
    12   2           1 

    cio' che si vorrebbe ottenere (?) e' il totale delle richieste per provenienza ed il totale delle richieste con stato='3', sempre per provenienza :
    Codice PHP:
    provenienza  totConferme totRichieste 
         1         4           6
         2         3           5
    .... 

    ... quando in una SELECT sono coinvolte "piu'" tabelle (JOIN) che hanno nomi di campo
    uguali per riferirci ad uno dei campi, si utilizzamo gli ALIAS di tabella.
    Gli Alias vanno inseriti dopo il/i nomi delle Tabelle coinvolte nell query e ogni volta che ci si riferisce ad uno di essi, si fa precedere il nome del campo dall'ALIAS e punto ( in genere come nomi di ALIAS sono usati i nomi A, B, etc.. ma si puo' utilizzare altro)

    ... qui' c'e' una sola tabella (contatti) ????!!!!

    si, la tabella "fisicamente" e' una!!! ... ma nella/e SELECT l'estrazione avviane facendo riferimento alle tabelle in manira "logica";

    >>> SELECT count(B.stato) as totConferme, count(A.provenienza) as totRichieste
    ... proiezione delle colonne :

    count del campo : stato (tabella B)
    ( attribuiscigli il nome totConferma - nel result set, la colonna avra' il nome:totConferma)

    ... e del count del campo provenienza (tabella A)
    ( attribuiscigli il nome totRichieste ....)

    >>> FROM contatti A

    ... dalla tabella "logica" A che fa (riferimento alla tabella "fisica" contatti)


    ... a questo punto, tralasciando per un momento la LEFT JOIN e guardando la clausola

    >>> GROUP BY A.provenienza

    ... vogliamo che le righe siano raggruppate per il campo provenienza, si otterra' una riga per ogni canale di vendita contenete il totale di tutte le richieste il count(A.provenienza)

    ... volendo ottenere anche il totale delle sole richieste confermate (stato='3') non posso estrarlo dalla stessa tabella "logica", altrimenti mi darebbe lo stesso valore

    ... lo estraggo da un'altra tabella "logica", chiamata B (fisicamente e' la stessa) mettendo in relazione le due tabelle (SELF JOIN) attraveso una colonna (ho ipotizzato la key) AND la condizione di delle sole righe con stato = '3'.

    Il count(B.stato) ( il campo stato ora e' preso dalla tabella B ) e conterra' il conteggio delle sole richieste comfermate

    >>> LEFT JOIN contatti B ON A.id = B.id AND B.stato = '3'


    ... le righe del result set vanno poi etratte con un ciclo (ad ogni riga ci saranno i due total)


    p.s.
    perdonami se non sono stato chiaro, ma il caldo

  10. #10

    chiaro

    ok ho capito e ti ringrazio tantissimo. veramente ho capito a grandi linee ma ti prometto che approfondirò l'argomento... è stato importante sapere in che direzione procedere nel mio costante apprendimento

    detto questo, ti ripropongo la stessa domanda posta ieri a l''evangelista:

    in questo modo il server ha un carico enorme di lavoro? quante volte esegue la query?
    tante quante le conferme o tante quanti i record della tabella?

    il codice l'ho impostato così. va bene?
    l'output va bene, vorrei capire se il concetto di scrittura si il più corretto

    grazie ancora.

    Codice PHP:
    $query "SELECT count(B.stato) as totConferme, count(A.provenienza) as totRichieste, A.provenienza 
    FROM  contatti A 
    LEFT  JOIN contatti B ON A.id = B.id AND B.stato = '3' 
    GROUP BY A.provenienza"
    ;

    $result2 mysql_query($query) or die (mysql_error());
    while (
    $res_str mysql_fetch_assoc($result2))
    {
        if(
    $res_str['provenienza'] == 0) {$canale "Non Trattate: ";}
        elseif(
    $res_str['provenienza'] == 1) {$canale "Canale 1: ";}
        elseif(
    $res_str['provenienza'] == 2) {$canale "Canale 2: ";}
        elseif(
    $res_str['provenienza'] == 3) {$canale "Canale 3: ";}
        else {
    $canale "Canale 4: ";}            
    echo 
    "[b]".$canale."[/b]".$res_str['totConferme']."/".$res_str['totRichieste']."
    "
    ;

    ---------------------------
    danielix05

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 © 2025 vBulletin Solutions, Inc. All rights reserved.