Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Airfry
    Registrato dal
    Jan 2003
    Messaggi
    106

    Prendere valore più alto da una join

    Ho bisogno di stampare a video il valore più alto di una colonna e non riesco a comporre l'array su cui utilizzare la funzione max().
    Vorrei evitare di eseguire una seconda select per recuperare il valore massimo.
    In pratica nella pagina del carrello visualizzo i prodotti da acquistare estraendo dei dati dalla tabella dell'anagrafica articoli e da quella degli ordini. Poichè ho un campo nell'anagrafica articoli con i tempi di consegna (per alcuni prodotti la merce è a giacenza e per altri servono tempi di produzione da 2 a 5 giorni), devo avvisare il cliente che la merce sarà spedita tra X giorni, ossia il valore massimo presente in tabella anagr. articoli tra gli articoli scelti.

    questa è la SELECT che utilizzo per ricavare i dati che mi servono per visualizzare gli articoli.
    • $sql6 = "
      SELECT articoli.*, ordini.*
      FROM articoli INNER JOIN ordini
      ON articoli.id_articoli = ordini.cl_id_articolo
      AND ordini.cl_ordine = $n_ordine
      AND ordini.cl_confermato = 'no'
      ";


    Devo per forza fare un'altra SELECT?
    Avrei voluto poter utilizzare una funzione del genere
    $consegna = max(array (qui i valori che non so ricavare));

    Grazie per l'aiuto.
    Lo spartito della vita
    è un insieme di note.
    Ognuno è artefice della propria armonia.

  2. #2
    Utente di HTML.it L'avatar di Airfry
    Registrato dal
    Jan 2003
    Messaggi
    106
    Ho fatto un miliardo di prove...
    ma mi sto perdendo inesorabilmente...
    Se scrivo questo
    • while($riga = @mysql_fetch_array($result)) {
      $valore = max(array($riga['tempo_cons']));
      }


    Io so che il valore che mi serve è li dentro!!!

    Ma come posso tirare fuori il valore più alto?
    Lo spartito della vita
    è un insieme di note.
    Ognuno è artefice della propria armonia.

  3. #3
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    fammi capire....
    in $valore = max(array($riga['tempo_cons'])); hai valori sparsi o in un qualche ordine crescente o decrescente?
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  4. #4
    Dovresti fare

    $sql6 = "
    SELECT articoli.*, ordini.*
    FROM articoli INNER JOIN ordini
    ON articoli.id_articoli = ordini.cl_id_articolo
    AND ordini.cl_ordine = $n_ordine
    AND ordini.cl_confermato = 'no'
    ORDER BY articoli.tempo_cons DESC
    ";


    In questo modo consideri i vari articoli che l'utente ha scelto ordinandoli per ordine decrescente di tempi di consegna: ciò vuol dire che la prima riga ke estrarrai conterrà l'articolo per il quale occorrono + giorni per l'ordine che, poi, penso coinciderà con il tempo di consegna di tutta la merce.

    Quindi:

    $result = @mysql_query($conn, $sql6) or die("Impossibile prelevare gli articoli selezionati");

    if ($riga = @mysql_fetch_array($result))
    {
    $valore = $riga['tempo_cons']);
    }


    L'istruzione che avevi scritto:

    while($riga = @mysql_fetch_array($result))
    {
    $valore = max(array($riga['tempo_cons']));
    }


    non ha alcun senso.

    Innanzitutto $riga contiene solo il record corrente, cioé che attualmente stai esaminando.
    $riga['tempo_cons'] contiene penso un valore intero, supponiamo 2;

    array(2) penso voglia dire che vuoi creare un array di 2 elementi, che ovviamente è vuoto perché non contiene alcun valore.

    max (array(2)) ?????

    Quando fai
    $result = @mysql_query($conn, $sql6) or die("Impossibile prelevare gli articoli selezionati");

    cioé quando viene eseguita una SELECT, tutti i record vengono posti in una certa area; $result, non è altro che un puntatore a questa area.

    quando fai
    $riga = @mysql_fetch_array($result)

    Non fai altro che considerare il record a cui attualmente punta $result, il quale poi viene incrementato in modo tale da puntare al record successivo.
    Infatti se rifai

    $riga = @mysql_fetch_array($result)

    adesso in $riga ci sarà il 2° record, mentre $result punterà al 3° e così via. Ecco perché per leggere tutti i record usi il ciclo while.

    La tua operazione di prendere il valore max avrebbe un significato se tu in $riga avessi tutti i record che hai letto dal DB, ma non è così. in $riga ci sarà un record alla volta. Quindi al massimo dovevi scrivere:

    $valore = 0;
    while($riga = @mysql_fetch_array($result))
    {
    $tempo = $riga['tempo_cons']);

    if ($tempo > $valore) $valore = $tempo;
    }

    In tal modo in $valore hai il max. valore di tempo_cons


    Ciao.

  5. #5
    dottwatson, forse hai ragione tu, probabilmente ho interpretato male io il tipo del campo tempo_cons

  6. #6
    Utente di HTML.it L'avatar di Airfry
    Registrato dal
    Jan 2003
    Messaggi
    106
    innanzitutto GRAZIE.
    Premetto che ne sono venuto fuori grazie al vs contributo, ma fare una cosa e vederla funzionare senza averla capita mi lascia vuoto di soddisfazione.
    Per quanto riguarda la domanda di dottwatson in quella stringa ho dentro questi valori (ma sono un esempio... ) 15324 (1 giorno, 5 giorni ecc). Sono nell'identico ordine con cui sono stati inseriti nel carrello dal cliente.

    Per questo vedendoli tutti li dentro, cercavo un modo per tirare fuori il più alto. Ma con gli array ho un pò di allergia e le cose non sono sempre così ovvie come lo sono per la maggior parte di voi.

    Per gianf_tarantino un ulteriore grazie. Mi hai permesso di vedere il problema con un'ottica diversa.
    Tra i vari suggerimenti (e spiegazioni molto precise!!!) non ho potuto utilizzare l'ordine ASC per una questione di comprensione dell'ordine da parte del cliente. Preferisco che visualizzi i prodotti così come li ha inseriti.... (Funzionava però) ma mi hai fatto ragionare.
    Non riuscendo a tirare fuori quel benedetto numero più alto, ho usato questo ciclo if che mi hai suggerito:
    if ($tempo > $valore) $valore = $tempo;
    La precisone con cui mi hai dato le info mi ha fatto incuriosire... e l'ho utilizzata tale e quale... e funziona. MA NON CAPISCO
    Io sono rimasto a cose del genere:
    if ($tempo > $valore) {
    $valore = $tempo;
    } ecc...
    ma come fa a funzionare senza le graffe?
    Giuro che sono in sbattimento.
    Lo spartito della vita
    è un insieme di note.
    Ognuno è artefice della propria armonia.

  7. #7
    ma come fa a funzionare senza le graffe?

    if ($tempo > $valore) {
    $valore = $tempo;
    } ecc...


    Non riesco a capire cosa vuoi dire.
    Comunque quando usi l'if se all'interno del blocco delimitato dalle parentesi graffe vi è + di un'istruzione allora le graffe sono obbligatorie, se vuoi inserire solo un'istruzione allora puoi anche ometterle. Per intenderci:

    if ($tempo > $valore)
    {
    $valore = $tempo;
    }
    $x="prova";

    è la stessa cosa se scrivi

    if ($tempo > $valore) $valore = $tempo;

    $x="prova";

    Spero di aver capito bene.


    Tra i vari suggerimenti (e spiegazioni molto precise!!!) non ho potuto utilizzare l'ordine ASC per una questione di comprensione dell'ordine da parte del cliente. Preferisco che visualizzi i prodotti così come li ha inseriti.... (Funzionava però) ma mi hai fatto ragionare.


    Potresti utilizzare 2 query differenti, una (quella ke ti ho suggerito) solo per estrarre il valore + alto di giorni di ordine. L'altra uguale ma senza l'ordine ASC per visualizzare i prodotti così come il cliente li ha inseriti.


    Per quanto riguarda la domanda di dottwatson in quella stringa ho dentro questi valori (ma sono un esempio... ) 15324 (1 giorno, 5 giorni ecc). Sono nell'identico ordine con cui sono stati inseriti nel carrello dal cliente.

    Fammi capire una cosa, ma questo benedetto campo tempo_cons contiene per un solo prodotto il tempo di ordine di quel prodotto, oppure contiene l'ordine di tutti i prodotti. Infatti non ho ben capito quando hai scritto 15324....

    Scusami ma non sarebbe + semplice scrivere 1,2,5,...... cioé separare i vari giorni con una virgola, altrimenti se hai ad es. 12 giorni di consegna, nella sequenza ipotetica:

    34125 dodici viene visto come 1 giorno, 2 giorni, ecc......

    O mi sfugge qualcosa?

  8. #8
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    dovrebbe essere

    (1,5,7,12,3,8) da quello che ho capito io...

    if non è mai sbagliato, difatti è un costruttore di linguaggio tra i piu diffusi al mondo.

    riguardo alla soluzione if o sort() le differenze possono essere molteplici e sostanziali.

    c'è da dire che in molti casi si opta o per una o per l'altra in base alle conoscenze del programmatore e alle situazioni in cui ci si trova a gestire i dati.

    tu hai optato per if e non c'è nulla di male, conosci le conseguenze e ti senti più sicuro, come invece qualcun' altro per motivi di finezza (anche noi abbiamo le nostre pippe ) o di , ancora piu importante "praticità" opterebbe per sorr o asort() perchè ha piu confidenza con certe istruzioni.

    io per esempio avrei fatto così (questa è praticità però, fondamentalmente sono fine come un cinghiale)

    $nuovo_array_provvisorio=array($riga['tempo_cons']);
    sort($nuovo_array_provvisorio);
    reset($nuovo_array_provvisorio);
    echo $nuovo_array_provvisorio[0];


    probabilmente ci sarà un piccolo errore da qualche parte ma spero che la mia idea venga interpretata bene....


    se hai allergia agli array è un handicap non indifferente... gli array sono fondamentali per la gestione dei dati in php... ti consiglio qualche piccolo tutorial in internet ce ne sono a milioni e alcuni di una facilità di apprendimento notevole
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  9. #9
    Utente di HTML.it L'avatar di Airfry
    Registrato dal
    Jan 2003
    Messaggi
    106
    X gianf_tarantino:
    Come fa a funzionare me lo chiedevo anch'io, per questo ho postato ancora. E così ho imparato una cosa nuova... Credetemi che ho speso un sacco di soldi in manuali, e mai ci ho trovato una sintassi senza le graffe. Ne farò tesoro.
    I valori di "15324" di cui parlavo con dottwatson sono quelli che mi ritrovavo dalla concatenazione dei campi estratti dal database nel campo tempi_consegna.
    Ogni anagrafica articolo ha questo campo (tempi_consegna), o meglio in ogni riga dell'ana articoli c'è la colonna tempi_consegna. E sono tutti contenuti in tempi da 1 a 5 gg lavorativi. Questo solo per dare un chiarimento alla tua domanda e permetterti di capire meglio cosa significasse.

    Il ciclo if ha comunque risolto il mio problema. (lo preferisco al sort).
    Con una seconda query era già funzionante, ma mi ero interstardito a non usarla in quanto si trattava di "visualizzare" dei dati che avevo già estratto con la join.
    Apprezzo il suggerimento di dottwatson sugli array. Il mio messaggio circa la mia "allergia" per gli array è forse stato espresso in modo sbagliato... li ho capiti... ci ho messo 10 volte il tempo degli altri esseri umani, ma li ho capiti. Il fatto è che all'insorgere di problemi metto sempre in dubbio quello che ho fatto e di essermi perso qualche pezzo per strada.

    Grazie, grazie veramente per l'aiuto.
    Lo spartito della vita
    è un insieme di note.
    Ognuno è artefice della propria armonia.

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.