MySQL根据最接近的匹配值连接两个表
我有以下情况:MySQL根据最接近的匹配值连接两个表,mysql,join,Mysql,Join,我有以下情况: tableA +-------+-------+ | id | Value | +-------+-------+ | 1 | 1000 | | 2 | 20 | | 3 | 62 | | 4 | 0 | +-------+-------+ tableB +-------+--------+ | Value | Lookup | +-------+--------+ | 10 | a | | 20
tableA
+-------+-------+
| id | Value |
+-------+-------+
| 1 | 1000 |
| 2 | 20 |
| 3 | 62 |
| 4 | 0 |
+-------+-------+
tableB
+-------+--------+
| Value | Lookup |
+-------+--------+
| 10 | a |
| 20 | b |
| 30 | b |
| 40 | g |
| 50 | h |
| 60 | f |
| 70 | a |
| 80 | a |
| 90 | v |
| 100 | b |
+-------+--------+
我需要返回表B中与表A中的值字段最匹配的查找
+-------+-------+--------+
| id | Value | Lookup |
+-------+-------+--------+
| 1 | 1000 | b |
| 2 | 20 | b |
| 3 | 62 | f |
| 4 | 0 | a |
+-------+-------+--------+
如何执行此操作?一种方法是使用相关子查询:
SELECT a.Id, a.Value,
(SELECT b.Lookup
FROM TableB AS b
ORDER BY ABS(a.Value - b.Value) LIMIT 1)
FROM TableA AS a
这里有一个使用连接的选项:
SELECT
a.Id, a.Value, b.Lookup
FROM tableA a
CROSS JOIN tableB b
INNER JOIN
(
SELECT a.Id, MIN(ABS(a.Value - b.Value)) AS min_abs_value
FROM tableA a
CROSS JOIN tableB b
GROUP BY a.Id
) t
ON a.Id = t.Id AND
ABS(a.Value - b.Value) = t.min_abs_value;
虽然此查询确实连接到子查询,但子查询不相关。非常感谢,非常感谢。但是你知道我如何在不使用子查询的情况下做到这一点吗?原因是使用此查找的数据集将超过100000行,我想最大限度地提高性能。@Josh对于
TableA
中的每条记录,您需要对TableB
中的所有记录进行交叉连接,以计算值
差异。这是由于您的桌子的设计。因此,我认为不使用子查询是不可能解决这个问题的。@Josh…但它不需要相互关联。如果你要在这里呆一段时间,请看我所需要的。