【问题标题】:MySQL: Replace a column's values with values in a new table that are closestMySQL:用新表中最接近的值替换列的值
【发布时间】:2011-06-21 04:52:43
【问题描述】:

我有两张这样的表:

Table1 (ID, Kilometers, Depth)
Table2 (ID, Kilometers, Depth)

Sample Data:
Table 1
1, 0.001, 10
2, 0.002, 11
3, 0.003, 11

Table 2
1, 0.001, 10
2, 0.003, 12
3, 0.004, 15

我需要根据其公里值将表1中的深度替换为表2中的深度。

但是,对于表 1 中的每个人来说,表 2 中可能没有公里值。所以我需要获取最接近的值(按公里)并在替换中使用它的深度。

我希望通过一条 SQL 语句来实现这一点。 直接替换就像:

UPDATE T1, T2 SET T1.Depth = T2.Depth WHERE T1.Kilometers = T2.Kilometers

我有什么办法可以调整它以获得最接近的值?

【问题讨论】:

  • 提示:最接近 = 差的绝对值最小。 SQL 方便地有ABS-MIN
  • 表2中哪条记录最接近表2中的记录2?
  • “任何一个都可以”从来都不是编写 SQL 的好规范。 SQL 通常希望你准确。
  • 明白,答案可以在任何一个方向上都是精确的。我只是想模拟我遇到的问题。

标签: mysql sql replace sql-update closest


【解决方案1】:

这很简单,做你想做的事:

UPDATE table1 SET depth = (
     SELECT depth FROM table2 
     ORDER BY (ABS(table1.kilometers-table2.kilometers)) ASC 
     LIMIT 1
);

-- Query OK, 2 rows affected (0.00 sec)

mysql> select * from table1;
+----+------------+-------+
| id | kilometers | depth |
+----+------------+-------+
|  1 |      0.001 |    10 |
|  2 |      0.002 |    10 |
|  3 |      0.003 |    12 |
+----+------------+-------+

【讨论】:

    【解决方案2】:
    update tbl1
    inner join (
        select tbl1.id,
            (
                select id
                from tbl2
                order by abs(tbl2.Kilometers - tbl1.Kilometers) asc
                limit 1
            ) AS tbl2id
        from tbl1
    ) X
        on tbl1.id = X.id
    inner join tbl2
        on tbl2.id = X.tbl2id
    
    set tbl1.depth = tbl2.depth;
    

    注意:tbl1tbl2 是两个表名。 X 是给子查询的别名,它根据tbl1.id 确定最接近的匹配项。 tbl2id 是 tbl2 中最接近每个 tbl1.idid,在子查询中具有别名。

    【讨论】:

    • 嗯,无法正常工作 - "tbl2id" 和 "X" 到底是什么
    • @simon 评论添加到答案
    猜你喜欢
    • 2012-04-22
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多