Ciao a tutti ho il segunete problema:
ho un database mysql con una tabella composta dai seguenti campi id, data_ora, address e adc, dove l'address è l'indirizzo per riconoscere il sensore e adc è il valore misurato. In questi campi vengono memorizzate informazioni di 2 sensori diversi. tutti e due trasmettono i dati ogni 30sec. Il problema è che 1 sensore ha dato dei valori in più in quanto ha fatto delle ritrasmissioni (e quindi memorizzato valori uguali di adc) e quindi ha memorizzato 2 o 3 volte lo stesso valore (con id consecutivi), in ordine sparso. Il mio problema è che i 2 sensori devono avere lo stesso numero di record. Come faccio ad eseguire una query in un database mysql che mi cerchi i record con valori uguali di adc dello stesso address e con id consecutivi?
Cercare valori uguali in un database mysql
Moderatori:
Paolino,
fairyvilje
-
nakatamarco
0 2 - New entry

- Messaggi: 65
- Iscritto il: 4 ott 2010, 18:08
0
voti
[1] Cercare valori uguali in un database mysql
0
voti
[2] Re: Cercare valori uguali in un database mysql
E' parecchio che non uso SQL, comunque una mezza soluzione potrebbe essere quella che sto per proporti.
Però attenzione, devi rielaborarla: la mia versione, se trasformata in eliminazione (delete anziché select), vale solo ed esclusivamente per coppie di doppioni consecutivi (quindi doppioni non consecutivi non verranno eliminati; se un elemento ha due doppioni, solo il primo viene eliminato; ...).
Se però in data_ora tu segni anche i secondi (e quindi due elementi con lo stesso valore di data_ora e lo stesso valore di address sono necessariamente doppioni) la soluzione può essere migliore.
Questa, se fatta diventare un comando di eliminazione, eliminerebbe anche i doppioni non consecutivi e i doppioni "multipli".
Ripeto però che è tanto che non uso SQL e probabilmente il mio codice è da rivedere e correggere (non vorrei che alla fine ti cancelli tutto... Quindi prima fai delle prove su tabelle diverse e fai un backup dei dati che hai a disposizione).
Però attenzione, devi rielaborarla: la mia versione, se trasformata in eliminazione (delete anziché select), vale solo ed esclusivamente per coppie di doppioni consecutivi (quindi doppioni non consecutivi non verranno eliminati; se un elemento ha due doppioni, solo il primo viene eliminato; ...).
Codice: Seleziona tutto
select * from tua_tabella a, tua_tabella b
where a.id = b.id + 1 and
a.data_ora = b.data_ora and
a.address = b.address and
a.adc = b.adcSe però in data_ora tu segni anche i secondi (e quindi due elementi con lo stesso valore di data_ora e lo stesso valore di address sono necessariamente doppioni) la soluzione può essere migliore.
Codice: Seleziona tutto
select * from tua_tabella a, tua_tabella b
where a.id <> b.id and
a.data_ora = b.data_ora and
a.address = b.addressQuesta, se fatta diventare un comando di eliminazione, eliminerebbe anche i doppioni non consecutivi e i doppioni "multipli".
Ripeto però che è tanto che non uso SQL e probabilmente il mio codice è da rivedere e correggere (non vorrei che alla fine ti cancelli tutto... Quindi prima fai delle prove su tabelle diverse e fai un backup dei dati che hai a disposizione).
0
voti
[3] Re: Cercare valori uguali in un database mysql
Si deve capire meglio cosa c'è in data_ora.
Se i dati doppi (quelli ritrasmessi), oltre che essere consecutivi, hanno data_ora UGUALI... allora la soluzione per selezionare solo i record unici, senza doppioni, è banale:
Se invece i doppioni hanno data_ora diversa il discorso cambia (si complica) e bisogna avere qualche dettaglio in più.
In quel caso mi vengono in mente 2 soluzioni, una con stored procedures (una valle di lacrime in Mysql) e una meno pulita utilizzando il MOD di data_ora con 30 (ammesso che data_ora contenga i secondi).
Per continuare in questa direzione però sarebbe necessario che tu postassi qualche riga di dati di esempio.
Un'osservazione: non sarebbe il caso di rivedere il modo in cui vengono inseriti i valori nella tabella e mettere un controllo in quel punto invece di dover sistemare le cose dopo?
Se invece è un'operazione che devi fare solo una volta e non devi per forza farla usando una query MySQL, poche righe di codice di qualsiasi linguaggio a te conosciuto possono risolvere il tuo problema.
ciao
Se i dati doppi (quelli ritrasmessi), oltre che essere consecutivi, hanno data_ora UGUALI... allora la soluzione per selezionare solo i record unici, senza doppioni, è banale:
Codice: Seleziona tutto
SELECT * FROM tabella GROUP BY data_ora, address, adcSe invece i doppioni hanno data_ora diversa il discorso cambia (si complica) e bisogna avere qualche dettaglio in più.
In quel caso mi vengono in mente 2 soluzioni, una con stored procedures (una valle di lacrime in Mysql) e una meno pulita utilizzando il MOD di data_ora con 30 (ammesso che data_ora contenga i secondi).
Per continuare in questa direzione però sarebbe necessario che tu postassi qualche riga di dati di esempio.
Un'osservazione: non sarebbe il caso di rivedere il modo in cui vengono inseriti i valori nella tabella e mettere un controllo in quel punto invece di dover sistemare le cose dopo?
Se invece è un'operazione che devi fare solo una volta e non devi per forza farla usando una query MySQL, poche righe di codice di qualsiasi linguaggio a te conosciuto possono risolvere il tuo problema.
ciao
in /dev/null no one can hear you scream
-
nakatamarco
0 2 - New entry

- Messaggi: 65
- Iscritto il: 4 ott 2010, 18:08
0
voti
[4] Re: Cercare valori uguali in un database mysql
nakatamarco ha scritto:select * from tua_tabella a, tua_tabella b
where a.id = b.id + 1 and
a.data_ora = b.data_ora and
a.address = b.address and
a.adc = b.adc
Il problema della data ora è che la ripetizione ha 1 secondo in più.
Utilizzando il tuo codice, togliendo l'ugualianza del campo data, mi becca le ripetizioni, ma seleziona anche altri record che non centrano nulla, quindi non posso utilizzare il delete, e quando me li mostra non mi dà il quadratino affianco al record per eliminarli.
Comunque grazie per l'aiuto. Ciao.
-
nakatamarco
0 2 - New entry

- Messaggi: 65
- Iscritto il: 4 ott 2010, 18:08
0
voti
[6] Re: Cercare valori uguali in un database mysql
scusami, sono scemo io!. Funziona e mi da in effetti tutte le ripetizioni.
L'unica cosa mi dà problemi con il delete. la sintassi che uso è la seguente:
delete from dati a, dati b where a.id=b.id+1 and a.address=b.address and a.adc=b.adc.
Penso il problema sia in dati a, dati b.
L'unica cosa mi dà problemi con il delete. la sintassi che uso è la seguente:
delete from dati a, dati b where a.id=b.id+1 and a.address=b.address and a.adc=b.adc.
Penso il problema sia in dati a, dati b.
-
nakatamarco
0 2 - New entry

- Messaggi: 65
- Iscritto il: 4 ott 2010, 18:08
0
voti
[7] Re: Cercare valori uguali in un database mysql
angus ha scritto:gli intervalli di tempo (per i valori corretti, esclusi i doppioni), sono sempre, esattamente 30sec?
Putroppo non sono esattamente, a volte sono 31 sec
0
voti
[8] Re: Cercare valori uguali in un database mysql
nakatamarco ha scritto:delete from dati a, dati b where a.id=b.id+1 and a.address=b.address and a.adc=b.adc.
Penso il problema sia in dati a, dati b.
no, manca un *
Codice: Seleziona tutto
DELETE * FROM ...in /dev/null no one can hear you scream
-
nakatamarco
0 2 - New entry

- Messaggi: 65
- Iscritto il: 4 ott 2010, 18:08
0
voti
[9] Re: Cercare valori uguali in un database mysql
no non va con l'asterisco.
Per me il problema è che non si fa il delete from dati, ma si fa from dati a, dati b e quindi penso non sa da dove eliminare i record.
Per me il problema è che non si fa il delete from dati, ma si fa from dati a, dati b e quindi penso non sa da dove eliminare i record.
0
voti
[10] Re: Cercare valori uguali in un database mysql
Credo che il problema del codice che ho proposto stia nel fatto che MySQL non sa se eliminare i dati da a o da b.
Allora forse si potrebbe provare ad annidare in questo modo:
Però ripeto che se i doppioni sono più di uno, solo il primo viene eliminato; se non sono consecutivi, non vengono eliminati (un caso sfavorevole potrebbe essere quello in cui il primo sensore trasmette un dato, poi il secondo ne trasmette un altro, infine il primo sensore fa una ripetizione).
Edit:
Forse sarebbe meglio qualcosa del tipo:
Però bisogna vedere in che modo viene memorizzato data_ora: se è il numero di secondi (o magari millisecondi) passati dalla mezzanotte del 01/01/1970, allora il metodo funziona; altrimenti mi sa che MySQL non sa fare la sottrazione.
Il vincolo "a.id - b.id < 5" l'ho messo solo come spunto, perché se si fa la verifica con la differenza di secondo allora quella non serve... Però se non è possibile fare la verifica con i secondi, allora "a.id - b.id < 5" può essere utile per eliminare anche le ripetizioni non consecutive.
Allora forse si potrebbe provare ad annidare in questo modo:
Codice: Seleziona tutto
select * from dati a
where exists (select * from dati b
where a.id + 1 = b.id and
a.address = b.address and
a.adc = b.adc)Però ripeto che se i doppioni sono più di uno, solo il primo viene eliminato; se non sono consecutivi, non vengono eliminati (un caso sfavorevole potrebbe essere quello in cui il primo sensore trasmette un dato, poi il secondo ne trasmette un altro, infine il primo sensore fa una ripetizione).
Edit:
Forse sarebbe meglio qualcosa del tipo:
Codice: Seleziona tutto
select * from dati a
where exists (select * from dati b
where a.id - b.id < 5 and
a.data_ora - b.data_ora < 29 and
a.address = b.address and
a.adc = b.adc)Però bisogna vedere in che modo viene memorizzato data_ora: se è il numero di secondi (o magari millisecondi) passati dalla mezzanotte del 01/01/1970, allora il metodo funziona; altrimenti mi sa che MySQL non sa fare la sottrazione.
Il vincolo "a.id - b.id < 5" l'ho messo solo come spunto, perché se si fa la verifica con la differenza di secondo allora quella non serve... Però se non è possibile fare la verifica con i secondi, allora "a.id - b.id < 5" può essere utile per eliminare anche le ripetizioni non consecutive.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)



