带有 2 个 INNER JOIN 的 MYSQL 更新挂起

Posted

技术标签:

【中文标题】带有 2 个 INNER JOIN 的 MYSQL 更新挂起【英文标题】:MYSQL Update with 2 INNER JOINs hangs 【发布时间】:2010-06-30 17:47:15 【问题描述】:

我正在尝试根据两个连接表中是否存在一个字段来更新我的表中的字段。

update quotes
inner join collection_records ON quotes.id <> collection_records.record_id
inner join subcollection_records ON quotes.id <> subcollection_records.record_id
set quotes.status_id = 1
where collection_records.type = 'Quote' 
   or subcollection_records.type = 'Quote'

此查询运行,但挂起。如果我在内部连接中删除它可以工作,但我需要检查两个连接表是否存在报价 ID。

【问题讨论】:

LEFT JOIN 会是去这里的方式吗? 你正在做一个巨大的交叉连接,连接集合和子集合行的所有可能组合除了ID匹配的地方。如果该语句开始运行,它几乎肯定会更新每个报价。这不是检查可连接行不存在的方法......使用小马答案中的空连接方法。 【参考方案1】:

必须小心,因为为了唯一的支持数据,使用 JOIN 会冒重复数据的风险。我将您的查询重写为:

UPDATE QUOTES
   SET status_id = 1
 WHERE id NOT IN (SELECT cr.record_id
                    FROM COLLECTION_RECORDS cr
                    WHERE cr.type = 'Quote')
   AND id NOT IN (SELECT sr.record_id
                    FROM SUBCOLLECTION_RECORDS sr
                   WHERE sr.type = 'Quote')

使用 LEFT JOIN/IS NULL:

UPDATE QUOTES
LEFT JOIN COLLECTION_RECORDS cr ON cr.record_id = id
                               AND cr.type = 'Quote'
LEFT JOIN SUBCOLLECTION_RECORDS sr ON sr.record_id = id
                                  AND sr.type = 'Quote'
  SET status_id = 1
WHERE cr.record_id IS NULL
  AND sr.record_id IS NULL

【讨论】:

OMG Ponies 我认为上面的查询应该可以解决问题。非常感谢!【参考方案2】:

我的猜测是这主要是由于 (NOT EQUALS) 运算符。这真的是您要在这里寻找的东西吗?

【讨论】:

【参考方案3】:

此外,如果您在两个连接表中都有 Quote 记录....您将获得 2 条记录。似乎取出其中一个联接只向您返回一条记录。尝试对两个表中都存在的某个 Quote 进行选择而不是更新,看看您是否得到两条记录。您必须向下修改联接才能返回一条报价记录。

【讨论】:

以上是关于带有 2 个 INNER JOIN 的 MYSQL 更新挂起的主要内容,如果未能解决你的问题,请参考以下文章

Postgres COUNT 个带有 INNER JOIN 的列值

MySQL中inner join 和 cross join 的区别

使用 INNER JOIN 时得到重复的结果

MySQL中inner join 和 cross join 的区别

mysql 里面JOIN 和 INNER JOIN 区别是啥

在带有 HTML 的 ASP 中使用 INNER JOIN