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

    [PHP-mySQL] La prossima riga...

    Ciao a tutti, volevo sapere se esiste una funzione che mi permetta di agire sulle righe di una tabella. Mi spiego meglio:

    Ho una cosa del genere:

    [id ]-[tipo]-[descr]
    --------------------
    | 1 | |cibo| |pane |
    --------------------
    | 2 | |cibo| |salame|
    --------------------
    | 3 | |beva| |acqua|
    --------------------
    | 4 | |beva| |cola|

    Recupero tutti i campi con la query, divido tutto per "tipo".
    Ora, come faccio a dire:

    codice:
    if (il primo = cibo)
    {nonfare niente}
    
    else
    
    {leggi la seconda riga della tabella}
    
    if (il secondo = cibo)
    {nonfare niente}
    
    else
    
    (leggi la terza riga)
    e cosi via....

    Se il primo e' cibo si ferma, se invece e bevanda leggo i dati e controllo quella dopo che se e' cibo si ferma ma se e' bevanda va a quella dopo etc....

    Ovviamente ogni volta che legge una riga successiva ad una noncibo deve prendersi i dati nel campo [descr].

    Mi aiutate?

    Grassie

  2. #2
    Ottimizzo:

    if($tipo == cibo)
    {stop}
    else
    {leggi il valore $descr;
    memorizza il valore $descr[#];
    ripeti lo script}

    Come posso scriverlo?



  3. #3
    Quel che non capisco è xchè estrai tutti i dati se a quelli di tipo cibo passi una funzione che non fa nulla... non fai prima a estrarre soltanto quelli di tipo bevanda?

    codice:
    mysql_query("SELECT * FROM tabella WHERE tipo = 'beva'");
    _YD

  4. #4
    Perche' mi serve sapere le bevande che non vengono dopo il cibo.
    se nella tabella ho in prima posizione un cibo non mi importa del resto ma se ho una bevanda mi interessa sapere quante bevande e di che tipo arrivano dopo.

  5. #5
    Continuo a non capire esattamente cosa devi fare...

    in ogni caso, estratti i record puoi provare a fare una cosa del genere:
    codice:
    while($r=mysql_fetch_array($q)){
    while($r[tipo]!="cibo"){
    // fai quel che devi fare
    }
    }
    _YD

  6. #6
    Ma facendo cosi' va in loop vero?

    In pratica:

    - se il primo e' cibo (non fai niente)
    - se il primo e' bevanda (leggi il valore) e continua a leggere la tabella.

  7. #7
    Originariamente inviato da Patrizio@84
    Perche' mi serve sapere le bevande che non vengono dopo il cibo.
    se nella tabella ho in prima posizione un cibo non mi importa del resto ma se ho una bevanda mi interessa sapere quante bevande e di che tipo arrivano dopo.
    Guarda che nella tabella che hai segnalato non esiste un ordine... l'unico ordine che mi viene in mente è l'ordine di inserimento, ma bada l'ID non serve per creare una lista di record inseriti in ordine. L'ID serve per riconoscere un record univocamente.

    Mi sembra che utilizzi impropriamente le tabelle.
    Alla tabella che hai segnalato puoi dare l'ordine che preferisci, basta utilizzare il comando ORDER BY

    La funzione che vuoi fare di scrematura dei risultati, leggi il campo e guarda se c'è "cibo" e se no vai avanti, non serve ad una mazza.

    Se vuoi una mano cerca di spiegare la logica con cui un elemento dovrebbe essere "scartato" rispetto ad un altro e perchè dovrebbe leggere il campo successivo. Sono sicuro che ti possiamo aiutare.

  8. #8
    Forse ho semplificato troppo l'esempio.
    Ho un software che lavora su una tabella di mySQL. Esso mi restituisce una "coda" di riproduzione audio. Quindi io un ordine lo ho.
    Il problema e' che nella coda ho due tipologie di file audio: tipo "I" e tipo "S". Ho bisogno di calcolare se, in ordine cronologico, ho in coda un tipo "S" o un tipo "I" e se dopo di esso c'e' un altro "I".
    Devo fare un calcolo matematico di durata in secondi di tutti i tipi "I" imminenti, niente di strano. La cosa e' che se ho un "S" subito in coda il calcolo non lo devo fare, ma se ho un tipo "I" il calcolo lo devo fare sia su di lui che su l'eventuale "I" successivo.
    Serve per il calcolo di una differita dove "I" e' spazio di pausa e "S" e' spazio utile quindi vorrei il totale di "I" ma non su tutta la table perche' non avrebbe senso, non sarebbero ne imminenti ne consecutivi.

    coda:

    id | codice | tipo
    ---------------------------
    12345 | 123 | I
    12346 | 137 | S

    etc... dove ID e' la mia cronologia. La tabella si aggiorna continuamente, viene usata come coda "temporanea".
    La query attuale mette in ordine ascendente il campo ID cosi da darmi l'ordine esatto di riproduzione.
    Una query che filtri i soli tipi "I" non servirebbe, in quanto mi restituirebbe tutti gli "I" anche non consecutivi o cmq non immediati (nella prima posizione).
    Spero di aver spiegato bene


  9. #9
    P.S.= ho gia provato a fare varie query ma senza risultato, e' un operazione che deve essere effettuata sicuramente dopo.

  10. #10
    lo fai con due query.


    Prima esegui una query dove chiedi:

    quando sarà il prossimo S? (limitata a 1)

    -> estrai l'id che ottieni e l'utilizzi per creare la seconda query:

    quanti I incontro fino all'id considerato?

    e puoi fare così:

    codice:
    SELECT * FROM table WHERE tipo = s ORDER BY id LIMIT 1
    
    estrai l'id che ottieni e poi fai la seguente query:
    
    SELECT * FROM table WHERE tipo = I AND id < $id_stratto
    Funziona... e utilizzerai 2 query per fare tutto.
    Non solo, se desideri puoi sommare i risultati direttamente dentro la query utilizzando il comando SUM(campo); e il modificatore GROUP BY tipo.

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