【问题标题】:MySQL UPDATE value base on its orderMySQL UPDATE 值基于其顺序
【发布时间】:2013-12-06 19:22:16
【问题描述】:

我想根据行的id 位置为我的行赋值,但仅限于某个timestamp

假设我有一个tbl1idtbl2_id value timestamp 和一个tbl2idtimestamp。我的两张表由tbl2.id = tbl1.tbl2_id 关联。

首先,我想

SELECT * 
FROM tbl1
WHERE tbl1.timestamp > tbl2.timestamp 
GROUP BY tbl2_id

例如,如果这返回我 100 行。我想SET tbl1.value = 1 为第 1-10 行,基于tbl1.id 升序。然后,SET tbl1.value = 2 第 11-20 行等等...

我相信我可以使用CASE 完成最后一部分。但是我不确定如何将所有这些放在一个 UPDATE 查询中。

【问题讨论】:

    标签: mysql sql sql-update subquery case


    【解决方案1】:

    我猜你有一个错字,真正的意思是 SET tbl1.value = 2 row 11-20 等等

    这没有经过测试,但以下内容如何:

    SET @rank=0;
    UPDATE tbl1 AS mt1
      INNER JOIN 
      (
        SELECT @rank := @rank + 1 AS RowValue, st1.id
        FROM tbl1 AS st1
          INNER JOIN tbl2 AS st2 
          ON st1.Whatever = st2.Whatever
        WHERE st1.timestamp > st2.timestamp 
        GROUP BY st2.tbl2_id
      ) AS TempQ
      ON TempQ.id = mt1.id
    SET mt1.value = 
      CAST(((TempQ.RowValue / 10) AS UNSIGNED) + 
      CASE WHEN TempQ.RowValue MOD 10 = 0 THEN 0 ELSE 1 END
    

    在上面的查询中发生了以下情况:

    • tbl1.value = 1 如果 RowValue 小于 10
    • tbl1.value = 2 如果 RowValue 介于 10 和 20 之间
    • tbl1.value = 3 如果 RowValue 介于 20 和 30 之间

    我不知道tbl1 如何链接到tbl2。因此,您必须将st1.Whatever = st2.Whatever 更改为正确的。

    【讨论】:

      【解决方案2】:

      您可以像这样在连接中简单地更新:

      UPDATE tlb1
      INNER JOIN tbl2
        ON tbl1.tbl2_id = tbl2.id
      SET tbl1.value = 1
      WHERE tbl21.timestamp > tbl2.timestamp
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多