Visualizzazione risultati 1 fino 13 di 13

Discussione: conteggi record

  1. #1
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Smile conteggi record

    Salve a tutti,
    vorrei contare i valori uguali di una colonna del database.
    Ho cercato sul web, ma non ho capito bene come fare.
    Adesso cerco di spiegare quello che intendo, sperando di essere chiaro.
    Gestisco una piccola biblioteca e registro il prestito dei libri.
    Quando un visitatore preleva un libro segno nella colonna dei prestiti il numero corrispondente al suo ID.
    Quindi se Rossi preleva sei libri e il suo ID è uguale a 5, ho ripetuto, nella colonna prestiti, 6 volte il numero 5.
    Quello che voglio fare è appunto contare questi totali per ogni visitatore.
    Ho provato con questa query:
    Codice PHP:
    // PRIMA query per elencare i visitatori
    $sql="SELECT * FROM utenti WHERE anagrafica like '".mysql_real_escape_string($_POST['utente'])."%' ORDER BY anagrafica ASC ";
    $res=mysql_query($sql);
    // SECONDA query per contare le ricorrenze
    $q="SELECT ksprestito, COUNT(*) AS totale FROM libri GROUP BY ksprestito ";
    $result=mysql_query($sql) or die(mysql_error());
    $totale=mysql_result($result,0,0);
    Stampo una tabella con elencati i visitatori con i loro dati e il totale dei libri in prestito.
    La prima parte è OK, ma per i libri in prestito mi viene scritto solo 3 per ogni visitatore.
    Come potrei fare ? Grazie mille

  2. #2
    Guest

    Predefinito

    Stavo guardando questa tua richiesta, premetto che posso aver capito male però io l'ho risolta nel modo seguente, ho fatto una prova con PDO in una mia tabella e funziona , il ragionamento è semplice estraggo gli id e i libri con la select, id che sono presenti più di una volta nella colonna, con php eseguo il ciclo metto un contatore ogni volta che trovo una riga stampo il risultato finale, ci sono milioni di modi però...Io ho risolto così.

    Codice PHP:
    //apro la conn
    $db = new PDO("sqlite:MioDb.db");

    //faccio la select degli id presenti più di una volta
    $sql =("SELECT kprestito
    FROM Libri
    WHERE kprestito IN (
    SELECT kprestito
    FROM Libri
    GROUP BY kprestito
    HAVING COUNT(*) > 1
    )"
    );

    //eseguo la queri
    $esegui = $db->query($sql);

    $totale = 0; //imposto il contatore

    foreach ($esegui as $riga){
    if (
    $riga['kprestito'] == "INSERISCI QUI L'ID UTENTE CHE VUOI CONTROLLARE"){ //qui vado a passare l'id utente che voglio controllare
    $totale++; //INCREMENTO IL contatore
    }
    }
    echo
    $totale; //stampo la somma totale dei libri prelevati da quell'id
    Io ho usato pdo, devi implementarlo con il tuo sql...Ciao

    Ps:Tu puoi anche usare mysql_num_rows credo...
    PPS:Tutto sto casino ma a te basta scrivere questo
    Codice:
    SELECT ksprestito, COUNT(ksprestito) AS totale FROM Libri
        GROUP BY ksprestito ORDER BY totale DESC;
    Ciao buona domenica
    Ultima modifica di fractalcosmo : 15-03-2015 alle ore 04.04.45

  3. #3
    Guest

    Predefinito

    Grazie fractalcosmo,
    ho fatto come mi hai suggerito ed è più o meno come stavo provando di fare:
    Codice PHP:
    $q="SELECT ksprestito, COUNT(ksprestito) AS totale FROM Libri GROUP BY ksprestito ";
    $result=mysql_query($sql) or die(mysql_error());
    $totale=mysql_result($result,0,0);
    Ho tolto l'ordinamento che non mi serve.

    Però quando inserisco la variabile $totale nell'elenco che visualizzo (tramite la prima query e il suo ciclo while, come riportato nel primo messaggio) ottengo come risultato solo 3 in tutte le righe. Il fatto è che non capisco nemmeno dove tira fuori il numero tre, a meno che non consideri l'ID del visitatore.

    Però questi sono i valori reali che ho in tabella:
    visitatore (ID=1) dovrebbe contare che ha 7 libri, cioè il numero ID 1 è ripetuto 7 volte nella colonna ksprestito;
    visitatore (ID=2) ha 4 libri;
    visitatore (ID=3) ha 6 libri;
    visitatore (ID=4) ha 1 libro; e così via ...
    Grazie ancora per l'aiuto e buona doemnica anche a te.

  4. #4
    Guest

    Predefinito

    Ciao

    la query è corretta per quello che vuoi fare.
    Provato ad eseguirla direttamente in phpMyAdmin per vedere cosa ti restuisce?

  5. #5
    Guest

    Predefinito

    Si, grazie. Ho provato adesso. Su PhpMyAdmin funziona.
    Da le risposte giuste, anzi mi conta anche gli zeri (che non mi servono).

    Però sul sito no.
    Ottengo sempre un solo numero che in base alla ricerca che faccio corrisponde all'ID del primo nominativo, ripetuto nella tabella per tutti.
    Si tratta di capire dov'è l'inghippo. L'errore.
    Per maggior chiarezza posto tutto il listato.
    Grazie come sempre per il tuo prezioso aiuto
    Codice PHP:
    $sql="SELECT * FROM utenti WHERE anagrafica like '%".mysql_real_escape_string($_POST['utente'])."%' ORDER BY anagrafica ASC ";
    $res=mysql_query($sql);

    $q="SELECT ksprestito, COUNT(ksprestito) AS totale FROM libri GROUP BY ksprestito ";
    $result=mysql_query($sql) or die(mysql_error());
    $totale=mysql_result($result,0,0);

    $cont=1;

    if(
    mysql_num_rows($res))
    {
    echo
    '

    <table id="zebra" summary="Tabella zebra">
    <thead>
    <tr>
    <th scope="col" >Nr.</th>
    <th scope="col" >Anagrafica</th>
    <th scope="col" >indirizzo</th>
    <th scope="col" >tel. / cell.</th>
    <th scope="col" >email</th>
    <th scope="col" >documento</th>
    <th scope="col" >numero</th>
    <th scope="col"> Tot</th>
    <th scope="col"> </th>

    </tr>

    </thead>
    <tbody>
    '
    ;

    while (
    $row = mysql_fetch_array($res))
    {

    if((
    $cont%2)==0) // CONFRONTA SE è PARI
    echo '<tr class="zebra-pari">';
    else
    echo
    '<tr>'; // F5F5DC

    // per cambiare larghezza colonna, esempio <td style=width:100px>

    echo '
    <FORM method="POST" action="controlla_utente.php">
    <td>'
    . $row['id_utente'] . '<input type="hidden" name="idU" value="'.$row['id_utente'] .'"/></td>
    <td>'
    . $row['anagrafica'] . '<input type="hidden" name="anagrafica" value="'.$row['anagrafica'] .'"/></td>
    <td>'
    . $row['indirizzo'] . '</td>
    <td>'
    . $row['tel'] . '</td>
    <td>'
    . $row['email'] . '</td>
    <td>'
    . $row['documento'] . '</td>
    <td>'
    . $row['numero'] . '</td>
    <td>'
    . $totale . '</td>

    <td><INPUT type="submit" class="css_button2" value="CONTROLLA"></td>
    </FORM>
    </tr>
    '
    ;
    $cont++ ;
    }
    echo
    ' </tbody></table>';
    }
    else
    {
    echo
    '
    <div align="center">
    <div style="background-color: #eaea00; border-radius: 10px 10px 10px 10px; border: 2px solid #000066; padding: 8px; width:1000px; height: 30px;">
    <h3>L\' utente cercato <b>'
    . $_POST['utente'] . '</b> non &egrave presente in archivio.</h3></div><br />

    '
    ;
    }

  6. #6
    Guest

    Predefinito

    Dunque, per non prendere anche i dai aventi ZERO come totale aggiungi alla query "HAVING Count(ksprestito) > 0".
    Per il fatto che ottieni sempre un valore, così come hai scritto il codice è normale, poichè assegni alla variabile $totale solo (e sempre) un valore degli N prodotti dalla query.

  7. #7
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    OK, grazie. Come potrei fare ?

    Ho anche notato che la variabile $totale riporta sempre il risultato dell'ID del visitatore che risulta primo in elenco e quindi non della quantità dei libri da lui prelevato. Ho perciò anche questa problematica da risolvere. Strano perchè la query su PhpMyAdmin è perfetta, con i conteggi giusti. Grazie ancora per la disponibilità.

  8. #8
    Guest

    Predefinito

    Citazione Originalmente inviato da portier Visualizza messaggio
    Ho anche notato che la variabile $totale riporta sempre il risultato dell'ID del visitatore che risulta primo in elenco e quindi non della quantità dei libri da lui prelevato. Ho perciò anche questa problematica da risolvere. Strano perchè la query su PhpMyAdmin è perfetta, con i conteggi giusti. Grazie ancora per la disponibilità.
    Certo, perchè è quello che gli dici di fare visto che imposti il suo valore al primo record estratto

    Codice PHP:
    $totale=mysql_result($result,0,0);
    Fai una prova a riunire le due query

    Codice PHP:
    SELECT u.*, COUNT(ksprestito) AS 'totale'
    FROM utenti u
    INNER JOIN libri l ON u
    .id_utente = l.ksprestito
    WHERE anagrafica like
    '%".mysql_real_escape_string($_POST['utente'])."%'
    GROUP BY u.id_utente
    ORDER BY anagrafica ASC

  9. #9
    Guest

    Predefinito

    Grazie, prima di tutto della pazienza. Poi per la soluzione.
    Funziona alla perfezione. Sei un grande !
    Io però non ho capito bene tutto.
    Se non ti scoccia troppo me la spieghi ?
    Altrimenti va bene ugualmente, non voglio stressarti.
    Grazie ancora.

  10. #10
    Guest

    Predefinito

    In pratica la query unisce le due tabelle come fossero una e quindi riesci a lavorarci ricavando i dati che ti servono.

    Per approfondire cerca JOIN in rete, troverai un sacco di materiale.

  11. #11
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    Grazie.
    Con "u" invece cosa crei ?
    Ultima modifica di portier : 17-03-2015 alle ore 09.17.05

  12. #12
    Guest

    Predefinito

    Citazione Originalmente inviato da portier Visualizza messaggio
    Grazie.
    Con "u" invece cosa crei ?
    Codice PHP:
    FROM utenti u
    è come scrivere

    Codice PHP:
    FROM utenti AS u
    così ti sarà più chiaro che si tratta di un alias, e quindi scrivere

    Codice PHP:
    SELECT u.*
    equivale a scrivere

    Codice PHP:
    SELECT utenti.*

  13. #13
    Guest

    Predefinito

    Grazie, sei stato molto chiaro. Ciao

Regole di scrittura

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