Visualizzazione risultati 1 fino 6 di 6

Discussione: Valorizzare un SELECT COUNT

  1. #1
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito Valorizzare un SELECT COUNT

    Ciao ragazzi, domanda forse sciocca.
    Ho una tabella chiamata entrate, all'interno della quale ci sono mila e mila dati ordinati in 3 campi (login, user e data).
    Effettuo un check per vedere se un determinato valore, all'atto di login, è uguale a qualcun'altro:

    Codice PHP:
    $check = ok_query("SELECT COUNT(*) AS num_tot FROM entrate WHERE v1 = '$v1' && user != '$Login'");

    if (
    $check['num_tot'] > 0) {
    ok_query("INSERT INTO controlli (login, user, data) VALUES ('$Login', '????', NOW())");
    }
    Il codice funziona correttamente. L'unica cosa che francamente mi sfugge è come valorizzare il campo user.
    Se $check['num_tot'] > 0 si rivelasse vera, avrei bisogno di riuscire a estrarre i risultati e stamparsi nell'insert finale.
    Avete idee?

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    [...] avrei bisogno di riuscire a estrarre i risultati e stamparsi nell'insert finale.
    Hai accennato a "i risultati": quali risultati? Di quale query o operazione?

    Cosa intendi per "stamparli nell'insert"? INSERT è un'operazione, non un terminale su cui stampare informazioni. Supponendo che tu intenda usare "i risultati" per costruire il testo della query di inserimento, dovresti chiarire come gestire il fatto che "i risultati" possano essere più di uno, mentre l'inserimento è uno solo: intendi inserire un dato aggregato? Oppure effettuare tanti inserimenti quanti sono "i risultati"?

    I suggerimenti che do più spesso:


  3. #3
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    ...
    Ciao mzanella, intanto grazie della risposta.
    Ti faccio un esempio, perché ieri notte mi sono spiegato da cane.

    Come prima procedura, cerco tra i mila dati presenti in entratese c'è almeno 1 v2 identico e che user non sia Login. Faccio dunque così:

    Codice PHP:
    $check = ok_query("SELECT COUNT(*) AS num_tot FROM entrate WHERE v1 = '$v2' && user != '$Login'");
    if (
    $check['num_tot'] > 0) {
    echo
    'esito positivo';
    } else {
    echo
    'esito negativo';
    }
    Tutta questa parte va benissimo, funziona e non ha problemi.
    La mia intenzione, una volta controllata l'esistenza, sarebbe quella di estrarre tutti questi valori scovati dalla funzione $check e inserili in una nuova tabella (controlli).
    Quindi al posto di ESITO POSITIVO, fare un insert

    Codice PHP:
    ok_query("INSERT INTO controlli (login, user, data) VALUES ('$Login', '????', NOW())");
    In questa circostanza, l'unico campo che non mi riempie è "user" di $check, che ovviamente resta vuoto.
    Ultima modifica di personalthings : 24-03-2021 alle ore 15.24.19

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Già più chiaro .

    Innanzitutto, tieni conto che la quantità di user che concorrono al conteggio nell'operazione di check non è noto a priori. Potresti averne 1, oppure qualche migliaio. Non puoi usare una singola INSERT, dovrai ripeterla tante volte quanti sono i record su cui la SELECT ha trovato una corrispondenza.

    Questo pone come prima cosa il problema di estrarre i dati: se usi SELECT COUNT(*) AS num_tot non stai leggendo un insieme di utenti, bensì la sua cardinalità, è una bella differenza. Quella query andrà modificata leggendo l'informazione di cui hai effettivamente bisogno. Da essa potrai anche dedurre quello che ora è num_tot, di cui non avrai più bisogno.
    Fatto questo dovrai iterare sugli utenti letti dalla SELECT e, per ciascuno, effettuare un'INSERT. Potresti rendere quest'operazione più rapida con dei prepared_statement, ma non so se il tuo wrapper ok_query li supporti.

    L'operazione di per sé non è complessa, ma senza sapere chi è ok_query e cosa fa è difficile darti indicazioni sul codice. Se fosse un PDO o mysqli il risultato sarebbe qualcosa di simile a:
    Codice PHP:
    $check = $dbh->query("SELECT user FROM entrate WHERE v1 = '$v2' AND user != '$Login'");
    $insert_sth = $dbh->prepare("INSERT INTO controlli(login, user, data) VALUES(:login, :user, NOW())");
    $num_tot = 0;
    while (
    $row = $check->fetch()) {
    $insert_sth->execute(array(
    ':login' => $Login,
    ':user' => $row['user']
    ));
    $num_tot++;
    }
    if (
    $num_tot == 0) {
    echo
    'esito negativo';
    }

    I suggerimenti che do più spesso:


  5. #5
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    ...
    Grazie mille per la spiegazione mzanella, molto chiaro.
    Purtroppo no, il mio non supporta i prepared_statement. Leggendo però la tua spiegazione, ho riflettuto su una cosa. Effettivamente parlando, quando ricerco fra i mille e mille dati, non ha senso che io estragga tutto, ma mi basterebbe estrarre solo l'ultimo risultato in ordine cronologico.
    Una cosa dunque così:

    Codice PHP:
    $check = ok_query("SELECT COUNT(*) AS num_tot FROM entrate WHERE v1 = '$v2' && user != '$Login' ORDER BY data DESC LIMIT 1");
    Dunque, estraendo solo l'ultimo risultato, la situazione cambierebbe? O sarei costretto a usare comunque i prepared_statement?

  6. #6
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    I prepared statement sono sempre utili ma mai indispensabili. Anche nell'esempio di prima potresti sostituire lo statement con una query costruita al momento.

    mi basterebbe estrarre solo l'ultimo risultato in ordine cronologico
    Questo dipende da cosa vuoi realizzare, naturalmente. Se ti basta l'ultimo la situazione effettivamente si semplifica, ma hai comunque bisogno di recuperare sia l'informazione sul conteggio totale che l'utente; fortunatamente questo può essere ottenuto con una singola query:
    Codice PHP:
    $check = ok_query("SELECT user, COUNT(*) AS num_tot FROM entrate WHERE v1 = '$v2' AND user != '$Login' ORDER BY data DESC LIMIT 1");
    (diversamente da quella che hai mostrato, viene selezionata anche la colonna user).

    Avresti quindi a disposizione $check['user'] da poter usare nell'INSERT.

    I suggerimenti che do più spesso:


Regole di scrittura

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