• ModSenior

    Volendo puoi pure fare 2 query separate come ti ho detto sopra.

    Mentre la guida alle subquery la puoi trovare qui:
    http://dev.mysql.com/doc/refman/5.1/en/subqueries.html
    Non è nulla di complicato.


  • User

    Grazie. Mi studierò le subqueries.


  • User Attivo

    Ciao Joshua Whopper, non ho ben capito di cosa necessiti e cosa intendi per flag.

    In pratica hai:
    id - flag - dati vari

    Vuoi recuperare tutte le righe, partendo da quelle con il flag?
    Supponendo che il flag sia un numero e che se non sia "flaggato", flag valga 0 oppure NULL.

    In questo caso basta una normale query:
    SELECT * FROM tabella ORDER BY flag DESC, id DESC

    Prende tutte le tuble e in testa mette quelle con il flag.
    Oltre a ordinarle per flag, sono anche ordinate mettendo in cima le ultime inserite (a parità di flag).

    Saluti


  • User

    Ciao Bazarop,

    la situazione di base è quella da te descritta

    In pratica hai:
    id - flag - dati vari

    Il flag, che è un numero 0 = off, 1 = settato, si trova in una tupla qualsiasi della relazione/tabella e ce ne è uno solo settato.

    Vorrei riuscire a leggere tutte le tuple partendo da quella flaggata fino all'ultima.

    Il problema, secondo me, è che le tuple dopo quella flaggata NON sono flaggate.


  • User Attivo

    Credo di voglia semplicemente un left join, mi mostri un esempio di tabelle popolate con 3-4 valori per piacere ?


  • User Attivo

    Il problema, secondo me, è che le tuple dopo quella flaggata NON sono flaggate.

    Ciao, non vorrei mettere carne a cuocere, ma in futuro sei sicuro che non possano esserci più di un record con flag a 1
    Perchè con questa query basterebbe anche un solo flag in più e la stessa non funzionerebbe, pensaci
    Ciao da danny:vai:


  • User

    Ciao,
    la relazione viene aggiornata dall'utente che può solo aggiungere nuove tuple. Oltre a leggere il tutto, ovviamente. 🙂
    L'inserzione di nuovi domini/campi NON prevede il set/reset del famoso flag.

    L'aggiornamento del flag (set/reset) viene fatto da un cosidetto admin utilizzando un altro script che gli consente di leggere tutte le tuple partendo da quella con il flag settato fino all'ultima della relazione. Dopo di che il flag esistente viene resettato e ne viene settato uno sull'ultima tupla della relazione.

    Giusto per provare a chiarire

    Data 2012-01-01 ....dati vari.... flag=1
    .....                                               flag=0
    Data 2012-01-17....dati vari..... flag=0
    ```Vengono lette ed elaborate tutte le tuple a partire da 2012-01-01 fino alla fine della relazione (e.g. 2012-01-17)
    Al termine del tutto la situazione della relazione sarà
    
    

    Data 2012-01-01 ....dati vari.... flag=0
    ..... flag=0
    Data 2012-01-17....dati vari..... flag=1

    E' vero che potrebbero esserci mismatch per cui l'utente inserise una nuova tupla mentre l'admin fa le elaborazioni, ma questa è un'altra storia, al momento vorrei riuscire a leggere quelle benedette tuple partendo da quel benedetto flag :)

  • User Attivo

    Nell'esempio che mi hai mostrato, NON ESISTONO RELAZIONI.
    Le relazioni esistono tra più tabelle, nel tuo caso hai una sola tabella e non vedo come possano esserci relazioni, per quello la richiesta era poco chiara.

    Ti avevo già scritto la select da utilizzare. Non capisco perchè non vada bene.

    Vuoi una select che ti restituisca tutte le tuple, ordinate per data , ma con in cima quella con il flag.
    Ti riscrivo la select:

    
    SELECT * FROM tabella ORDER BY flag DESC, data ASC
    
    

  • User

    Ho utilizzato il termine relazione perchè nel mio lavoro quelle che usualmente si chiamano table vengono identificate come relazioni, le tuple sono i record e i domini sono i campi. Deformazione professionale. 🙂

    Quanto alla soluzione da te proposta, ad onor del vero, sulla carta non mi convinceva molto ma ora che tempo e possibilità di provarla lo farò e ti farò
    sapere.


  • User

    Ho fatto una prova utilizando il tuo suggerimento
    "hardcopy" è il campo che contiene la flag

    $result = mysqli_query($db, "SELECT * FROM $db_table  ORDER BY hardcopy DESC, data ASC");
    while ($row = mysqli_fetch_array($result))
    {
    echo $row['data'],
    $row[....];
    }
    

    Quello che vedo è la prima tupla avente il flag settato poi tutte le tuple della relazione ordinate dal 2010-01-01 all'ultima

    Utilizzando

    $result = mysqli_query($db, "SELECT * FROM $db_table  WHERE hardcopy = '1' ORDER BY hardcopy DESC, data ASC");
    while ($row = mysqli_fetch_array($result))
    {
    echo $row['data'],
    $row[....];
    }
    

    vedo solo la tupla on il flag settato.


  • User Attivo

    Quello che vedo è la prima tupla avente il flag settato poi tutte le tuple della relazione ordinate dal 2010-01-01 all'ultima

    Non era quello di cui avevi bisogno?
    Tupla con flag in testa e di seguito le altre ordinate per data.

    PS: Se inserisci hardcopy = '1', ovviamente quelle non flaggate non vengono prese.


  • User

    Mi sa che proprio non riesco a farmi capire :gtsad:

    Proviamo così
    Supponi che nella relazione ci siano 100 tuple, per comodità supponiamo che la tupla flaggata sia la #85.
    Lo script deve trovare la tupla flaggata e da li leggere le altre fino alla 100 mai quelle prima perchè sono già state lette in una sessione precedente.

    Per cercare di essere ancora più chiaro ti ripropongo l'esempio delle 13:53 leggermente modificato

    Data 2011-01-01.....vari dati.....flag=0
    ........
    Data 2011-10-26 .... vari dati.... flag=0
    Data 2011-10-27......vari dati ...**.flag=1**
    Data 2011-10-27......vari dati.....flag=0 (possono esserci date uguali ma eventualmente solo una tupla avrà il flag settato)
    .......
    Data 2011-11-17....vari dati.....flag=0 (temporanea fine della relazione) [1]
    

    Per cui la ricerca deve iniziare dalla tupla con flag settato e terminare alla tupla con Data 2011-11-17 ignorando completamente quelle precedenti a quella avente il flag settato.

    Al termine della elaborazione la situazione della relazione diventerà

    Data 2011-01-01.....vari dati.....flag=0
    ........
    Data 2011-10-26 .... vari dati.... flag=0
    Data 2011-10-27......vari dati ...**.**flag=0
    Data 2011-10-27......vari dati.....flag=0 
    .......
    Data 2011-11-17....vari dati.....**flag=1**
    ```E la relazione è pronta per essere letta nuovamente, supponiamo il giorno 2011-12-03, partendo dalla tupla avente il flag settato che questa volta avrà come *Data 2011-11-17* e terminerà all'ultima tupla che nel nostro esempio avrà data *2011-12.03
    *
    fiuuuu.... spero di avercela fatta :smile5:
    
    [1] temporanea perchè poi l'utente potrà e dovrà inserire nuovi dati che verranno letti successivamente

  • User Attivo

    Ahh, scusa, non avevo proprio capito.

    SELECT * FROM table WHERE data>=(SELECT data FROM table WHERE flag =1) ORDER BY data ASC
    

  • User

    Questo mi piace 🙂
    Lo provo e ti faccio sapere


  • User

    FUNZIONA!!!!!!
    Perfetto

    Grazie infinite


  • User Attivo

    Figurati. Scusami, ma proprio non avevo capito.