2014-02-19 70 views
0

我正在使用MySQL。我試圖建立一些東西,卻找不到解決問題的辦法。根據多個標準選擇數據(cloest值)

我從lookup表中選擇一個基於my表的值,如下例所示。
選擇標準:
my.id<>l.idmy.route1=l.route1my.route2=l.route2my.utc=l.utc
其中my.stime is closest or same as l.stime

前)my.id=2的山坳應該得到因爲my.id<>l.idl.id=1, l.etime=7777,其餘的都是一樣的。
ex)my,id=5的col有選項l.id=3, l.etime=9999l.id=4, l.etime=7979my.id<>l.id, my.route=l.route, my.utc=l.utc。然而,由於my.stime=2220 is closer to l.stime=2222將比l.stime=3333l.id=3, l.etime=9999將被選中。
ex)my,id=6的示例是如果「最接近」是相同的,則選擇任一值。
ex)my,id=7的列示例是在條件未滿足時返回NULL。

Table: lookup (l.) 
id route1 route2 utc stime etime 
---|--------|--------|-----|-------|------ 
1  11  22  111 1111 7777 
2  11  22  111 1111 8888 
3  22  33  222 2222 9999 
4  22  33  222 3333 7979 
5  22  33  222 3335 8989 

Table: my (my.)      | result 
id route1 route2 utc stime | l.id l.etime  
---|--------|--------|-----|------- |-------|----------| 
2  11  22  111 1111 | 1  7777 
5  22  33  222 2220 | 3  9999 
6  22  33  222 3334 | 4or5 7979or8989 
7  22  33  999 9999 | null null  

一個新的表應該在哪裏,結果被追加到的my最後一個山坳創建。 任何幫助表示讚賞。提前致謝。

+0

減去這些值 - 然後按這個減法排序,並且限制1 – Randy

回答

0

該解決方案有點複雜,但它是一個起點。

首先,讓我們創建一個輔助表:

CREATE TEMP TABLE temp AS 
SELECT m.id mid, l.id lid, ABS(l.stime-m.stime) timediff 
FROM my m JOIN lookup l 
WHERE m.route1 = l.route1 AND m.route2 = l.route2 AND 
     m.utc = l.utc AND m.id <> l.id; 

從這個表中,我們可以得到最低timediff每個my.id

SELECT mid, min(timediff) mtimediff FROM temp GROUP BY mid 

結果:

mid   mtimediff 
---------- ---------- 
2   0   
5   2   
6   1   

現在我們可以找到lookup中的哪些行有這個stime差異,選擇最小id

SELECT t.mid mid, min(lid) lid 
FROM temp t JOIN (
    SELECT mid, min(timediff) mtimediff FROM temp GROUP BY mid 
) mt ON t.mid = mt.mid AND t.timediff = mt.mtimediff 
GROUP BY t.mid 

這是結果:

mid   lid  
---------- ---------- 
2   1   
5   3   
6   4   

最後,我們使用這些id s到從表中提取數據:

SELECT m.id, m.route1, m.route2, m.utc, m.stime, l.id, l.etime 
FROM my m JOIN lookup l JOIN (
    SELECT t.mid mid, min(lid) lid 
    FROM temp t JOIN (
     SELECT mid, min(timediff) mtimediff FROM temp GROUP BY mid 
    ) mt ON t.mid = mt.mid AND t.timediff = mt.mtimediff 
    GROUP BY t.mid 
) ON m.id = mid AND l.id = lid; 

贈送:

id   route1  route2  utc   stime  id   etime  
---------- ---------- ---------- ---------- ---------- ---------- ---------- 
2   11   22   111   1111  1   7777  
5   22   33   222   2220  3   9999  
6   22   33   222   3334  4   7979  
+0

這是在SQLite上測試的,因此MySQL的語法可能會略微偏離。 –

+0

太棒了!!!!!!謝謝@Emilio Silva然而,當我單獨執行它的時候,但是當我做完最後一部分時,我收到一個錯誤:「每個派生表都必須有它自己的數據,我想我會用別名搞混了。 – user3230889