Cercare valori uguali in un database mysql

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

Avatar utente
Foto Utentenakatamarco
0 2
New entry
New entry
Messaggi: 65
Iscritto il: 4 ott 2010, 18:08
0
voti

[1] Cercare valori uguali in un database mysql

Messaggioda Foto Utentenakatamarco » 20 gen 2011, 18:10

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?

Avatar utente
Foto UtenteBerello
110 1 3 7
Expert EY
Expert EY
Messaggi: 449
Iscritto il: 3 mar 2009, 22:53
Località: Roma
0
voti

[2] Re: Cercare valori uguali in un database mysql

Messaggioda Foto UtenteBerello » 21 gen 2011, 1:57

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; ...).

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.adc


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.

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.address

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).

Avatar utente
Foto Utenteangus
8.490 4 6 9
G.Master EY
G.Master EY
Messaggi: 4172
Iscritto il: 20 giu 2008, 17:25
0
voti

[3] Re: Cercare valori uguali in un database mysql

Messaggioda Foto Utenteangus » 21 gen 2011, 9:56

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:

Codice: Seleziona tutto

SELECT * FROM tabella GROUP BY data_ora, address, adc


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
in /dev/null no one can hear you scream

Avatar utente
Foto Utentenakatamarco
0 2
New entry
New entry
Messaggi: 65
Iscritto il: 4 ott 2010, 18:08
0
voti

[4] Re: Cercare valori uguali in un database mysql

Messaggioda Foto Utentenakatamarco » 21 gen 2011, 11:29

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.

Avatar utente
Foto Utenteangus
8.490 4 6 9
G.Master EY
G.Master EY
Messaggi: 4172
Iscritto il: 20 giu 2008, 17:25
0
voti

[5] Re: Cercare valori uguali in un database mysql

Messaggioda Foto Utenteangus » 21 gen 2011, 11:42

gli intervalli di tempo (per i valori corretti, esclusi i doppioni), sono sempre, esattamente 30sec?
in /dev/null no one can hear you scream

Avatar utente
Foto Utentenakatamarco
0 2
New entry
New entry
Messaggi: 65
Iscritto il: 4 ott 2010, 18:08
0
voti

[6] Re: Cercare valori uguali in un database mysql

Messaggioda Foto Utentenakatamarco » 21 gen 2011, 11:45

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.

Avatar utente
Foto Utentenakatamarco
0 2
New entry
New entry
Messaggi: 65
Iscritto il: 4 ott 2010, 18:08
0
voti

[7] Re: Cercare valori uguali in un database mysql

Messaggioda Foto Utentenakatamarco » 21 gen 2011, 11:57

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

Avatar utente
Foto Utenteangus
8.490 4 6 9
G.Master EY
G.Master EY
Messaggi: 4172
Iscritto il: 20 giu 2008, 17:25
0
voti

[8] Re: Cercare valori uguali in un database mysql

Messaggioda Foto Utenteangus » 21 gen 2011, 12:03

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

Avatar utente
Foto Utentenakatamarco
0 2
New entry
New entry
Messaggi: 65
Iscritto il: 4 ott 2010, 18:08
0
voti

[9] Re: Cercare valori uguali in un database mysql

Messaggioda Foto Utentenakatamarco » 21 gen 2011, 12:06

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.

Avatar utente
Foto UtenteBerello
110 1 3 7
Expert EY
Expert EY
Messaggi: 449
Iscritto il: 3 mar 2009, 22:53
Località: Roma
0
voti

[10] Re: Cercare valori uguali in un database mysql

Messaggioda Foto UtenteBerello » 21 gen 2011, 12:06

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:

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.


Torna a “PC e informatica”