この構造に単純化できる 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 に結合し、説明でフィルターして、説明 = abc の行のみを取得し、「重複」行を除外します。ここで、2 つの行が同じ値を持ち、日付が 1 から 6 分以内の場合は重複します。別。私の目的の出力テーブルは以下のとおりです (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.
残念ながら、このクエリは私のデータセットで実行するのに 1 分以上かかり、結果が返されません (結果があるはずですが)。このクエリを実行するより効率的な方法はありますか? 派生テーブルに名前を付けて、後で同じクエリで参照する方法はありますか? また、クエリが結果を返さないのはなぜですか?
助けてくれてありがとう!
編集:タイムスタンプが近いいくつかのサンプルの最初のものを保持したいと思います。
テーブル 1 には 610 万行、テーブル 2 には 30K の行があるため、テーブル 2 には "abc" という説明の行が 1 つしかないことがわかります。これは、事前に descr_id をクエリしてから、その id を使用して大きなクエリで table2 をまったく結合しないようにすることで、はるかに効率的にできることを意味します。ただし、私の table2 が上記のように設定されている場合 (これはデータベース設計が不十分であることは認めます)、そのようなクエリを実行する良い方法は何ですか?