【问题标题】:MYSQL Update Based On A Row Index Equaling An ID In Another Table基于等于另一个表中的 ID 的行索引的 MYSQL 更新
【发布时间】:2017-01-15 01:44:10
【问题描述】:

我有两张桌子。我想根据 table2 中的相同行索引更新 table1 中的一行。 ID 不匹配,但表 2 中的 ID 与行索引匹配。表 2 中总会有更多数据,但我不在乎是否遗漏了多余的行。

如何在 mysql UPDATE 语句中实现这一点?

   table 1      ______________      table 2     _____________
   Row number  |  id  | value |    Row number | id  | value |
               |--------------|               |-----|-------|
        1      |  2   |   A   |        1      |  1  |   W   |
        2      |  4   |   B   |        2      |  2  |   X   |
        3      |  6   |   C   |        3      |  3  |   Y   |
                                       4      |  4  |   Z   |

  to:
    table 1      ______________    
    Row number |  id  | value |   
               |--------------|   
        1      |  2   |   W   |   
        2      |  4   |   X   |  
        3      |  6   |   Y   |    

【问题讨论】:

  • “行索引” - 那是什么?
  • Row number 基于什么排序顺序?
  • 表格中的行号。 IE。第一行 row[0],或第二行 row[1]。
  • @1000111 显然不是。否则结果将是 W X Y ;-)
  • 仔细查看@Strawberry 后知道了。您的预期输出没有意义——对于 PO。

标签: mysql sql sql-update mysql-variables


【解决方案1】:

这行得通,但它并不漂亮。

set @c=0;
update t1
join (
    select tx.id,t2.value
    from t2
    join (
        select @c:=@c+1 as rownum, value, id
        from (
            select * from t1  order by id
        ) t3
    ) tx
    on t2.id=tx.rownum) tupdate
on t1.id = tupdate.id
set t1.value=tupdate.value;

它背后的基本点是使用一个变量来计算行数,然后使用它来连接。我最终使用了多个嵌套选择,因为要求是更新 t1,但只有在创建一个包含行数的版本之后。

如果重复,则需要在开头的set 阻止它过度计数。请参阅MySQL - Get row number on select 获取灵感。

【讨论】:

    猜你喜欢
    • 2012-08-23
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2015-05-02
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多