Ho 2 tabelle che possono essere semplificati a questa struttura:mysql efficiente unire 2 tabelle agli stessi 2 tabelle
Tabella 1:
+----+----------+---------------------+-------+
| id | descr_id | date | value |
+----+----------+---------------------+-------+
| 1 | 1 | 2013-09-20 16:39:06 | 1 |
+----+----------+---------------------+-------+
| 2 | 2 | 2013-09-20 16:44:06 | 1 |
+----+----------+---------------------+-------+
| 3 | 3 | 2013-09-20 16:49:06 | 5 |
+----+----------+---------------------+-------+
| 4 | 4 | 2013-09-20 16:44:06 | 894 |
+----+----------+---------------------+-------+
Tabella 2:
+----------+-------------+
| descr_id | description |
+----------+-------------+
| 1 | abc |
+----------+-------------+
| 2 | abc |
+----------+-------------+
| 3 | abc |
+----------+-------------+
| 4 | DEF |
+----------+-------------+
Voglio unire la descrizione a table1, filtrare per descrizione in modo da ottenere solo le righe where description = abc e filtrare le righe "duplicate", dove due righe sono duplicate se hanno lo stesso valore e le loro date sono entro 6 mi i nuti l'uno dell'altro. La mia tabella di output desiderata è sotto, (assumendo che abc sia il filtro di descrizione desiderato).
+----+----------+---------------------+-------+-------------+
| id | descr_id | date | value | description |
+----+----------+---------------------+-------+-------------+
| 1 | 1 | 2013-09-20 16:39:06 | 1 | abc |
+----+----------+---------------------+-------+-------------+
| 3 | 3 | 2013-09-20 16:49:06 | 5 | abc |
+----+----------+---------------------+-------+-------------+
La query mi è venuta è:
select *
from (
select *
from table1
join table2 using(descr_id)
where label='abc'
) t1
left join (
select *
from table1
join table2 using(descr_id)
where label='abc'
) t2 on(t1.date<t2.date and t1.date + interval 6 minute > t2.date)
where t1.value=t2.value.
Purtroppo questa query richiede più di un minuto di correre con il mio set di dati, e non ha prodotto alcun risultato (anche se credo che ci dovrebbe essere risultati). Esiste un modo più efficiente per eseguire questa query? C'è un modo per nominare una tabella derivata e farvi riferimento più tardi nella stessa query? Inoltre, perché la mia query non restituisce risultati?
Grazie in anticipo per l'aiuto!
modifica: Vorrei conservare il primo di molti campioni con data e ora di chiusura ravvicinata.
La mia tabella1 ha 6,1 milioni di righe, la mia tabella2 ha 30 K, il che mi fa capire che table2 avrebbe solo una riga per la descrizione "abc". Ciò significa che posso solo eseguire una query per descr_id in anticipo, quindi utilizzare quell'id per evitare di unire a table2 l'intera query, rendendolo molto più efficiente. Tuttavia, se la mia tabella2 fosse stata configurata come descritto sopra (il che sarebbe una cattiva progettazione del database, lo ammetto) qual è un buon modo per eseguire tale query?
Speri di mantenere il primo di diversi campioni con timestamp ravvicinati, o l'ultimo di essi, o la media dei loro timestamp, o cosa? Quale timestamp dovrebbe essere nel set di risultati per rappresentare ogni gruppo di campioni vicini? –
Bella domanda BTW +1 quanti dischi ha i tavoli? –