mam 2 tabele, które mogą być uproszczone do tej struktury:mysql wydajny sprzężeniu 2 tabelach tych samych 2 tabelach
Tabela 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 |
+----+----------+---------------------+-------+
Tabela 2:
+----------+-------------+
| descr_id | description |
+----------+-------------+
| 1 | abc |
+----------+-------------+
| 2 | abc |
+----------+-------------+
| 3 | abc |
+----------+-------------+
| 4 | DEF |
+----------+-------------+
Chcę dołączyć do opisu do tabeli1, filtrować według opisu, więc otrzymuję tylko wiersze gdzie opis = abc, i odfiltrowuję "duplikaty" wierszy, gdzie dwa wiersze są duplikatami, jeśli mają tę samą wartość, a ich daty są w granicach 6 mil nutes siebie. Moja pożądana tabela wyjściowa znajduje się poniżej (zakładając, że abc jest pożądanym filtrem opisu).
+----+----------+---------------------+-------+-------------+
| 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 |
+----+----------+---------------------+-------+-------------+
Zapytanie wymyśliłem to:
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.
Niestety zapytanie trwa ponad minutę do uruchomienia z moim zbiorze i Brak wyników wyszukiwania (chociaż uważam, że nie powinno być wyniki). Czy istnieje skuteczniejszy sposób wykonania tego zapytania? Czy istnieje sposób nazywać wyprowadzoną tabelę i odwoływać się do niej później w tym samym zapytaniu? Dlaczego moje zapytanie nie zwraca żadnych wyników?
Z góry dziękujemy za pomoc!
edytuj: Chciałbym zachować pierwszą z kilku próbek ze zbliżonymi znacznikami czasowymi.
Moja tabela1 ma 6,1 miliona wierszy, mój stół 2 ma 30K, co uświadamia mi, że tabela 2 będzie miała tylko jeden wiersz dla opisu "abc". Oznacza to, że mogę po prostu zapytać o descr_id wcześniej, a następnie użyć tego identyfikatora, aby w ogóle uniknąć dołączania do tabeli 2 w dużym zapytaniu, co znacznie usprawnia proces. Jednak jeśli mój table2 został skonfigurowany tak, jak opisano powyżej (co byłoby kiepskim projektem bazy danych, przyznaję), jaki jest dobry sposób na wykonanie takiego zapytania?
Czy chcąc zachować pierwsza kilka próbek ze zbliżonymi znacznikami czasu lub ostatnią z nich, lub uśredniając ich sygnatury czasowe, lub co? Jaki znacznik czasu powinien znajdować się w zestawie wyników, aby reprezentować każdą pęczek próbek jest blisko siebie? –
Ładne pytanie BTW +1 Ile rekordów ma tabel? –