我正在使用 MySQL 。我正在尝试构建一些东西而无法找到问题的解决方案。
我正在根据lookup
表从my
表中选择一个值,如下例所示。
选择标准:
my.id<>l.id
和my.route1=l.route1
以及my.route2=l.route2
和my.utc=l.utc
其中my.stime is closest or same as l.stime
ex)my.id=2
的col应该从l.id=1, l.etime=7777
获得my.id<>l.id
,其余的都是相同的。
ex)my,id=5
的col从l.id=3, l.etime=9999
开始有l.id=4, l.etime=7979
和my.id<>l.id, my.route=l.route, my.utc=l.utc
个选项。然而,由于my.stime=2220 is closer to l.stime=2222
比l.stime=3333
,l.id=3, l.etime=9999
将被选中
例如,my,id=6
的col示例是,如果“最接近”是相同的,则选择任一值
例如,my,id=7
的col示例是在不满足条件时返回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 :(得分: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
来从表中提取数据:
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