我有2個表即可以簡化該結構:MySQL的有效的連接到相同的2個表
表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 |
+----+----------+---------------------+-------+
表2:
+----------+-------------+
| descr_id | description |
+----------+-------------+
| 1 | abc |
+----------+-------------+
| 2 | abc |
+----------+-------------+
| 3 | abc |
+----------+-------------+
| 4 | DEF |
+----------+-------------+
我想將描述加入到table1中,按照描述進行過濾,因此我只獲取其中description = abc的行,並過濾掉「重複」行,其中兩行重複(如果它們具有相同的值並且日期在6 mi內)彼此相互吻合。我所需的輸出表如下(假設abc是所需的描述過濾器)。
+----+----------+---------------------+-------+-------------+
| 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 |
+----+----------+---------------------+-------+-------------+
我想出了查詢:
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.
不幸的是這個查詢需要一分鐘時間才能與我的數據集運行,並且不返回任何結果(雖然我認爲應該有結果)。有沒有更有效的方法來執行此查詢?有沒有一種方法來命名派生表並稍後在同一個查詢中引用它?另外,爲什麼我的查詢沒有返回結果?
在此先感謝您的幫助!
編輯: 我想保留幾個樣本中的第一個與相近的時間戳。
我的table1有610萬行,我的table2有30K,這讓我意識到table2只有一行描述「abc」。這意味着我可以事先查詢descr_id,然後使用該id來避免在大查詢中加入table2,使其效率更高。但是,如果我的table2的設置如上所述(這將是糟糕的數據庫設計,我承認)執行此類查詢的好方法是什麼?
你希望保持第一幾個樣本有時間戳,還是最後一個,或者平均時間戳,或者是什麼?結果集中應該包含什麼時間戳來表示每個樣本的相鄰關係? –
好的問題BTW +1這些表有多少記錄? –