2014-02-19 113 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