【问题标题】:MYSQL UPDATE using LEFT JOIN使用 LEFT JOIN 的 MYSQL 更新
【发布时间】:2013-04-19 10:13:28
【问题描述】:

问题;

在下面的 MySQL 查询中,产生 ConnectionID 列表的内部查询返回 34 个 ConnectionID。然后当我将这两个查询作为更新一起运行时,查询结果表明只有 14 行受到影响。我对 UPDATE 函数的理解是否不正确?

注释;

我正在尝试更新我的数据库,以便对于 Connections.PartnerID 等于 Partners.PartnerID 的任何给定连接,Partners 表中的 DefaultUserType 等于连接表中的 RoleID。

查询;

    UPDATE Connections
    LEFT JOIN Partners
        ON Connections.PartnerID = Partners.PartnerID
SET Connections.RoleID = Partners.DefaultUserType
WHERE
    ConnectionID IN(
        SELECT
            sub_qu_1.ConnectionID
        FROM
            (
                SELECT DISTINCT
                    Connections.ConnectionID,
                    Connections.MemberID,
                    Connections.FriendID,
                    Connections.RoleID,
                    Partners.DefaultUserType,
                    IF(Connections.RoleID = Partners.DefaultUserType,0,1)AS not_equal
                FROM
                    Connections
                LEFT JOIN Contacts ON Connections.FriendID = Contacts.EEID
                LEFT JOIN Partners ON Contacts.PartnerID = Partners.PartnerID
                WHERE
                    Partners.DefaultUserType NOT IN (28,29,30)
            )AS sub_qu_1
        WHERE
            not_equal = 1
        AND DefaultUserType IS NOT NULL
    )

【问题讨论】:

  • 您指的是哪个内部查询?在你的问题中指出这一点。在您的内部查询之后,有 Where 条件 "Wherer not_equal = 1" 。可能是这个原因
  • 我已经更新了问题。我指的是生成 ConnectionID 列表的内部查询(开始 SELECT sub_qu_1.ConnectionID)

标签: mysql database sql-update rows-affected


【解决方案1】:

我希望你没有几百万条记录! 如果没有在合作伙伴中记录,则使用 Coalesce(val,0) 设置为 0

    UPDATE Connections
SET Connections.RoleID = coalesce((select Partners.DefaultUserType FROM Partners WHERE Connections.PartnerID = Partners.PartnerID LIMIT 1),0)
WHERE
ConnectionID IN(
    SELECT
        sub_qu_1.ConnectionID
    FROM
        (
            SELECT DISTINCT
                Connections.ConnectionID,
                Connections.MemberID,
                Connections.FriendID,
                Connections.RoleID,
                Partners.DefaultUserType,
                IF(Connections.RoleID = Partners.DefaultUserType,0,1)AS not_equal
            FROM
                Connections
            LEFT JOIN Contacts ON Connections.FriendID = Contacts.EEID
            LEFT JOIN Partners ON Contacts.PartnerID = Partners.PartnerID
            WHERE
                Partners.DefaultUserType NOT IN (28,29,30)
        )AS sub_qu_1
    WHERE
        not_equal = 1
    AND DefaultUserType IS NOT NULL
)

已更正!

【讨论】:

  • 你好琼,很遗憾你建议的方法产生了不正确的结果。当我检查查询结果时,Connections 表中的 RoleID 与关联的 Partners DefaultUserType 不匹配。
  • 抱歉:... SET Connections.RoleID = coalesce((select Partners.DefaultUserType FROM Partners WHERE Con​​nections.PartnerID = Partners.PartnerID LIMIT 1),0)
  • 感谢琼就这个问题回复我。不幸的是,该查询仅影响内部查询标识的 34 行中的 14 行。
猜你喜欢
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 2011-02-15
  • 2018-02-28
  • 1970-01-01
相关资源
最近更新 更多