Mysql 从两个表中搜索最近的条目
我有两个表A和表B,它们有相同的字段。 我试图通过比较两个表中的不同字段来搜索表B中最接近的条目。(或基本上搜索表B中所列a的基准) 到目前为止,我所做的是:Mysql 从两个表中搜索最近的条目,mysql,sql,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
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个是很好的我认为您需要一个子查询来获得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
考虑到连接所需的计算量,我不认为这会很快。如果B上的两条记录与a上的一条记录有相同的差异,那么它也会遇到困难
SQL fiddle在此:-
@草莓我不会说这是离题的,解释相当清楚。但一些样本数据确实会有所帮助……好吧,我必须承认这并不明显。我贴了一个例子试图解释更多的一个不清楚的事情是你给每个“元组”的权重。执行一个
datetime-anotherdatetime
会让您的结果大大超过卷的重量:即使您将卷(第三个条目)更改为30000,这仍然是第一个返回的数据。你不想用Datediff吗?我同意你的看法。但是暂时不要注意重量。之后会进行调整。(事实上,数量是以十亿为单位表示的,因此不会真正改变结果)感谢您的回复。我马上试试这个。如果您在B上有两条记录具有相同的差异,那么您将同时获得这两条记录,这可能是您想要的(也可能不是)。但在这种情况下,如果您只需要A的一个结果,您必须找到一种方法来区分它们。您可以将GROUP by A.Id添加到最终查询中。这将消除除一个以外的所有B.id-s,尽管很难预测是哪一个remains@RuslanBes这有点滥用GROUPBY(并且违反SQL标准,尽管MySQL允许)。可能使用选择A.Id,MIN(B.Id)…按A.Id分组
获得具有最低Id的匹配。