【问题标题】:mysql 3 table join with updatemysql 3表加入更新
【发布时间】:2012-03-29 20:04:54
【问题描述】:

我正在尝试通过检查两个连接表来更新列的状态。即使我没有收到错误。该列未更新。我想获取一般的blockplot id,看看是否有匹配的交易和/或容器。如果有交易但没有容器,我需要将其标记为 P。

UPDATE (general
LEFT JOIN 
transactions 
ON 
general.blockplotid=transactions.blockplotid)
LEFT JOIN 
container 
ON 
general.blockplotid=container.blockplotid
SET general.lotstatus = 'P'
WHERE general.lotstatus != 'U' AND
transactions.id_transaction IS NOT NULL AND
container.id_container IS NULL

总结一下,我有 3 张桌子。我只想更新一张表中的一列。我想检查其他两个表中的值,它们的值取决于设定值。这三个表通过主键到外键连接。

当我执行双重连接选择语句时。查询似乎正确。

SELECT transactions.blockplotid AS blockplotid_2, container.blockplotid AS blockplotid_1, general.blockplotid, general.lotstatus, container.id_container, transactions.id_transaction
FROM ((general LEFT JOIN transactions ON general.blockplotid=transactions.blockplotid) LEFT JOIN container ON general.blockplotid=container.blockplotid)
ORDER BY general.blockplotid ASC

但似乎更新的连接不像选择。

这个查询似乎有效:

这个查询有效:

UPDATE ((general LEFT JOIN transactions ON transactions.blockplotid=general.blockplotid) LEFT JOIN container ON container.blockplotid=general.blockplotid)
SET general.lotstatus='P'
WHERE general.blockplotid!='U'  AND container.id_container is null  AND transactions.id_transaction is not null 

这里的区别在于 IS NOT NULL 的情况和 where 条件的顺序。 这有什么解释吗?

【问题讨论】:

  • 如果去掉括号会怎样?
  • 不更新任何行。也不返回任何错误。
  • 您确定有符合该条件的行吗?如果将查询从update 更改为select * from 会怎样?
  • 我对此进行了测试,它返回了 1,718 行
  • 嗯...您的general 表上有任何触发器吗?

标签: mysql join left-join


【解决方案1】:

我怀疑连接的括号/位置。尝试这样的设置:

UPDATE

Table1

SET

Table1

. Field1 = StagingTable . Field1

FROM

Table1

INNER JOIN StagingTable
ON Table1 . Field2 = StagingTable . Field2
WHERE

StagingTable . Field3 IS NOT NULL 

【讨论】:

    【解决方案2】:

    我建议重组您的 UPDATE 语句以嵌入 SUB-SELECT。更新通用集 lotstatus = (SELECT .... WHERE .... )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      相关资源
      最近更新 更多