Tôi có 2 bảng có thể được đơn giản hóa để cấu trúc này:mysql hiệu quả tham gia của 2 bảng vào 2 bảng cùng
Bảng 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 |
+----+----------+---------------------+-------+
Bảng 2:
+----------+-------------+
| descr_id | description |
+----------+-------------+
| 1 | abc |
+----------+-------------+
| 2 | abc |
+----------+-------------+
| 3 | abc |
+----------+-------------+
| 4 | DEF |
+----------+-------------+
Tôi muốn tham gia mô tả vào table1, lọc theo mô tả để tôi chỉ nhận các hàng có mô tả = abc và lọc ra các hàng "trùng lặp", trong đó hai hàng trùng lặp nếu chúng có cùng giá trị và ngày của chúng nằm trong vòng 9 dặm nutes của nhau. Bảng đầu ra mong muốn của tôi là dưới đây, (giả sử abc là bộ lọc mô tả mong muốn).
+----+----------+---------------------+-------+-------------+
| 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 |
+----+----------+---------------------+-------+-------------+
Truy vấn tôi đã đưa ra là:
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.
Thật không may truy vấn này mất hơn một phút để chạy với dữ liệu của tôi, và trả về không có kết quả (mặc dù tôi tin rằng cần có kết quả). Có cách nào hiệu quả hơn để thực hiện truy vấn này không? Có cách nào để đặt tên cho một bảng có nguồn gốc và tham chiếu nó sau này trong cùng một truy vấn không? Ngoài ra, tại sao truy vấn của tôi không trả lại kết quả?
Cảm ơn bạn đã trợ giúp!
chỉnh sửa: Tôi muốn giữ lại phần đầu của một số mẫu có dấu thời gian gần nhau.
Bảng 1 của tôi có 6,1 triệu hàng, bảng 2 của tôi có 30K, điều này khiến tôi nhận ra rằng bảng 2 chỉ có một hàng cho mô tả "abc". Điều này có nghĩa là tôi chỉ có thể truy vấn descr_id trước, sau đó sử dụng id đó để tránh tham gia table2 trong truy vấn lớn, làm cho nó hiệu quả hơn nhiều. Tuy nhiên, nếu table2 của tôi đã được thiết lập như đã nêu ở trên (đó sẽ là thiết kế cơ sở dữ liệu nghèo, tôi thừa nhận) một cách tốt để thực hiện một truy vấn như vậy là gì?
Bạn có hy vọng để giữ lại đầu tiên của một số mẫu có dấu thời gian gần nhau, hoặc cuối cùng của chúng, hoặc tính trung bình các dấu thời gian của chúng, hoặc cái gì? Dấu thời gian nào sẽ có trong resultset để biểu diễn từng bó mẫu của bạn ở gần nhau? –
Câu hỏi hay BTW +1 có bao nhiêu bản ghi mà các bảng có? –