I 2 Tabellen, die auf diese Struktur vereinfacht werden kann:mysql effizient verbinden von zwei Tabellen mit den gleichen zwei Tabellen
Tabelle 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 |
+----+----------+---------------------+-------+
Tabelle 2:
+----------+-------------+
| descr_id | description |
+----------+-------------+
| 1 | abc |
+----------+-------------+
| 2 | abc |
+----------+-------------+
| 3 | abc |
+----------+-------------+
| 4 | DEF |
+----------+-------------+
Ich möchte die Beschreibung in Tabelle1, Filter nach Beschreibung, so dass ich nur Zeilen mit Beschreibung = abc, und filtern Sie "doppelte" Zeilen, wo zwei Zeilen Duplikate sind, wenn sie den gleichen Wert haben und ihre Daten sind innerhalb von 6 Meilen nuten voneinander. Meine gewünschte Ausgabetabelle ist unten (angenommen, abc ist der gewünschte Beschreibungsfilter).
+----+----------+---------------------+-------+-------------+
| 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 |
+----+----------+---------------------+-------+-------------+
Die Abfrage kam ich mit ist:
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.
Leider ist diese Abfrage dauert länger als eine Minute mit meinen Daten-Set zu laufen, und liefert keine Ergebnisse (obwohl ich glaube, es sollte die Ergebnisse sein). Gibt es eine effizientere Möglichkeit, diese Abfrage durchzuführen? Gibt es eine Möglichkeit, eine abgeleitete Tabelle zu benennen und später in derselben Abfrage zu referenzieren? Warum gibt meine Abfrage keine Ergebnisse zurück?
Vielen Dank im Voraus für Hilfe!
edit: Ich möchte die erste von mehreren Proben mit engen Zeitstempeln beibehalten.
Meine Tabelle1 hat 6,1 Millionen Zeilen, meine Tabelle2 hat 30K, was mir klar macht, dass Tabelle2 nur eine Zeile für die Beschreibung "abc" hätte. Das bedeutet, dass ich vorher nur nach descr_id fragen kann, dann benutze diese ID, um zu vermeiden, dass table2 in der großen Abfrage überhaupt mitwirkt, was es viel effizienter macht. Wenn jedoch meine Tabelle2 wie oben beschrieben eingerichtet wurde (was ein schlechter Datenbankentwurf wäre, gebe ich zu), was ist eine gute Möglichkeit, eine solche Abfrage durchzuführen?
Hoffen Sie, die erste zu behalten mehrere Samples mit nahe beieinander liegenden Zeitstempeln, oder die letzten von ihnen, oder die Mittelung ihrer Zeitstempel, oder was? Welcher Zeitstempel sollte in der Ergebnismenge enthalten sein, um jeden Haufen Ihrer Proben dicht beieinander zu repräsentieren? –
Nette Frage BTW +1 wie viele Datensätze haben die Tabellen? –