Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从两个表中搜索最近的条目_Mysql_Sql - Fatal编程技术网

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

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

我有两个表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个是很好的

我认为您需要一个子查询来获得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的匹配。