从两个表中搜索最近的条目

时间:2014-07-02 08:53:38

标签: mysql sql

我有两个表A和B,它们具有相同的字段。 我想要做的是通过比较两个表中的不同字段来搜索表B中最近的条目。 (或基本上搜索表B中列出的A的基准) 到目前为止我所做的是:

SELECT  A.Id , B.Id  FROM A , B
order by ABS (a.Volume - b.Volume)+ ABS(a.FCDate-b.FCDate)+ ABS(a.IssueDate-b.IssueDate)

此查询的问题是它返回一个笛卡尔积。我想要的是对表A中的每个条目只有一个表B(例如前1)的结果。

我们举一个例子:

Table A 
id        Volume        FCDate        IssueDate
1         100           2014-01-01    2012-01-01

Table B
id        Volume        FCDate        IssueDate
1         95            2012-07-15    2000-01-01
2         100           2014-02-15    2004-01-01
3         100           2014-02-15    2011-09-20

查询结果必须是:

A.Id       B.Id
1          3

在这种情况下,使用上面的线性公式立即得到结果。但是根据我拥有的数据(+4000个条目),我有时候有3个4个结果。在这种情况下,我认为选择前1名会很好

1 个答案:

答案 0 :(得分:2)

认为你需要一个子查询来获得A上每条记录的最小差异,然后加入B,差异是相同的。

SELECT  A.Id AS aid, B.Id AS bid
FROM A 
INNER JOIN
(
    SELECT  A.Id , MIN(ABS (a.Volume - b.Volume)+ ABS(a.FCDate-b.FCDate)+ ABS(a.IssueDate-b.IssueDate))  AS MinDiff
    FROM A 
    CROSS JOIN B
    GROUP BY A.Id
) sub0
ON A.Id = sub0.Id
INNER JOIN B
ON ABS (a.Volume - b.Volume)+ ABS(a.FCDate-b.FCDate)+ ABS(a.IssueDate-b.IssueDate) = sub0.MinDiff

考虑到JOIN所需的计算,我不希望这很快。如果B上的2条记录与A

上的单条记录具有相同的差异,那也会很困难

SQL小提琴: -

http://www.sqlfiddle.com/#!2/03987/3