Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [MySql] ricavare l'ultimo evento da una tabella particolare

    salve a tutti ho un problema nel costruire una SELECT

    ecco la tabella:

    RegistroID | BarcaID | RegistroDataOra | RegistroFlagInOut | RegistroRotta | RegistroNote
    int(11) | int(11) | Timestamp | tinyint(1) | varchar(25) | varchar(25)

    praticamente vogli ottenere, con una query, lo stato in tempo reale o di una particolare dataora, di un piccolo porto turistico.
    Ossia chi è in mare (FLAG 1) e chi sta ormeggiato (FLAG 0).

    ho provato con svariate combinazioni di DISTINCT, GROUP BY, ORDER BY e MAX ma non ho mai ottenuto il risultato sperato. alcune Query non mi davano l'ultima dataora, altre mi prendevano il campo RegistroFlagInOut RegistroRotta e RegistroNote di altri record...

    cosa devo fare???

    Grazie a tutti....

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    La domanda non mi è chiara.
    Cosa vuoi ottenere? Il record più recente in cui il flag è a 1? Quello in cui è a 0? Il più recente tra i due? Il più recente di entrambi?

    Posta magari un dump e il risultato che vorresti ottenere.

  3. #3
    allora, sviluppo meglio il mio problema con un esenpio:
    Nel Porto ho 5 barche A,B,C,D,E in un particolare giorno succede questo:

    escono in mare quattro barche:
    0 | 2010-08-01 12:30:05 | A | 1
    1 | 2010-08-01 12:30:06 | B | 1
    2 | 2010-08-01 12:30:07 | C | 1
    3 | 2010-08-01 12:30:10 | D | 1

    poi la sera ne rientrano 2:
    4 | 2010-08-01 19:30:06 | B | 0
    5 | 2010-08-01 20:30:07 | C | 0

    il giorno dopo ne rientrana 1 e ne escono 2:

    6 | 2010-08-02 04:30:05 | A | 0
    7 | 2010-08-02 11:30:06 | B | 1
    8 | 2010-08-02 10:30:07 | C | 1

    alle ore 21:00 del 2010-08-01 voglio sapere chi è in porto e chi è fuori, ossia quello che devo vedere sarà:

    6 | 2010-08-02 04:30:05 | A | 0
    7 | 2010-08-02 11:30:06 | B | 1
    8 | 2010-08-02 10:30:07 | C | 1
    3 | 2010-08-01 12:30:10 | D | 1
    X | NULL | E | 0

    spero di essermi spiegato al meglio...

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da nizaram
    alle ore 21:00 del 2010-08-01 voglio sapere chi è in porto e chi è fuori, ossia quello che devo vedere sarà:

    6 | 2010-08-02 04:30:05 | A | 0
    7 | 2010-08-02 11:30:06 | B | 1
    8 | 2010-08-02 10:30:07 | C | 1
    3 | 2010-08-01 12:30:10 | D | 1
    X | NULL | E | 0

    spero di essermi spiegato al meglio...
    Se vuoi sapere la situazione al primo agosto come fai a ottenere i record relativi a date successive?

    La sostanza comunque è questa. Se vuoi specificare una data basta che aggiungi la clausola where nella query tra parentesi. Infine per includere anche barche non presenti nella tabella devi fare un left join tra una tabellla in cui siano presenti tutte e quella che contiene i dati.

    codice:
    select b1.* from barche b1
    inner join (select id from barche order by dataora desc) as  b2
    on b1.id = b2.id
    group by barca

  5. #5
    questa è la tua query:
    codice:
    select b1.* from barche b1
    inner join (select id from barche order by dataora desc) as  b2 on b1.id = b2.id
    group by barca
    ho modificato qualcosa perché mi dava campi ambigui:
    codice:
    select b1.* from barche, b1
    inner join (select id from barche order by dataora desc) as  b2 on b1.id = b2.id
    group by b1.barca
    correggimi se sbaglio:

    B1 è la tabella dove memorizzo le uscite, il mio registro
    barche è la tabella dove memorizzo i dati delle barche

    codice:
    select id from barche order by dataora desc
    il codice qui sopra è riferito al registro delle uscite?

    quindi dovrebbe essere:
    codice:
    select barca_id from b1 order by dataora desc
    ???

    cmq la query l'ho provata ma ci mette un sacco per svilupparla circa 15 secondi
    ed i record del registro sono appena 1500 ed i record delle barche 332

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    La mia query esegue un join su se stessa. b1 e b2 sono semplicemente degli alias della stessa tabella (quella che tu chiami uscite). Non prende in considerazione la tabella barche.

    Strano che impieghi tanto.

    Posta l'output della struttura della tabella uscite

    show create table nome_tabella_uscite

  7. #7
    codice:
    CREATE TABLE `opr_inoutpesca` (
     `InOutPesca_ID` int(11) NOT NULL AUTO_INCREMENT,
     `Barca_ID` int(11) NOT NULL,
     `InOutPesca_DataOra` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
     `InOutPesca_Flag` tinyint(1) NOT NULL,
     `InOutPesca_Rotta` int(11) DEFAULT NULL,
     `InOutPesca_Velocita` int(11) DEFAULT NULL,
     `InOutPesca_ZonaPesca` varchar(25) DEFAULT NULL,
     `IDAnagPersMil` int(11) NOT NULL,
     PRIMARY KEY (`InOutPesca_ID`)
    ) ENGINE=MyISAM AUTO_INCREMENT=1828 DEFAULT CHARSET=latin1
    ecco la tua query ora dovrebbe funzionare:
    codice:
    SELECT b1 . *
    FROM opr_inoutpesca b1
    INNER JOIN (
    
    SELECT `InOutPesca_ID`
    FROM opr_inoutpesca
    ORDER BY `InOutPesca_DataOra` DESC
    ) AS b2 ON b1.`InOutPesca_ID` = b2.`InOutPesca_ID`
    GROUP BY `Barca_ID`
    è giusta?

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Se è giusta me lo devi dire tu che hai i record sottomano
    Ti restituisce i record che ti aspetti?

    E' questa la query che impiega 15 secondi su 1800 record?

  9. #9
    SCUSA... è giusta!
    non ci mette più di mezzo secondo... avevo sbagliato a scrivere la query...

    Perfetto... ora devo solo inserire le barche che non hanno effettuato nessuna movimentazione nel registro ossia che sono rimaste sempre in porto...quindi l'unione di due tabelle!

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