【问题标题】:Complex update using joins and group by使用连接和分组的复杂更新
【发布时间】:2011-06-12 05:49:33
【问题描述】:

此查询从两个表中选择 ID,其中名称正好是一对一匹配的

SELECT d.guest_id, h.host_id
FROM `guest` AS g 
JOIN `guest_data` AS d 
    ON d.guest_id = g.guest_id 
JOIN host_data AS h 
    ON d.guest_nm = h.host_nm 
GROUP BY
    h.venue_nm 
HAVING COUNT(*) = 1

现在我无法更新 guest 表 (g) 以设置 g.link_id = h.host_id

基本上我想创建一个类似的语句

UPDATE `guest` AS g , `host` h
SET g.link_id = h.host_id
WHERE g.guest_id = ... AND h.host_id = ... the pairs in the previous statement

【问题讨论】:

  • 你能详细说明你遇到了什么麻烦吗?错误信息?
  • @kelloti:没有错误,我只是不知道如何将这个 SELECT 语句转换为 UPDATE 语句

标签: mysql join group-by


【解决方案1】:

您可能遇到的一个问题是,您可以为每个访客拥有许多 host_data 行,因此您必须使用聚合函数(我在下面使用 max)来获取要从中提取 host_id 的单行。我更喜欢 SQL Server,但我认为这种语法非常接近您将在 MySQL 上使用的语法。这是我的选择:

SELECT g.link_id, 
    (
        SELECT MAX(h.host_id)
        FROM guest_data d
        INNER JOIN host_data h ON d.guest_nm=hhost_nm
        GROUP BY h.venue_nm
        HAVING COUNT(*) = 1
    ) AS x
FROM guest g
WHERE g.guest_id IN 
(
    SELECT d.guest_id
    FROM guest_data d
    INNER JOIN host_data h ON d.guest_nm=hhost_nm
    GROUP BY h.venue_nm
    HAVING COUNT(*) = 1
)

检查 select 返回正确的结果集后,您可以轻松地将其转换为 UPDATE 语句:

UPDATE guest g
SET link_id=
    (
        SELECT MAX(h.host_id)
        FROM guest_data d
        INNER JOIN host_data h ON d.guest_nm=hhost_nm
        WHERE d.guest_id=g.guest_id
        GROUP BY h.venue_nm
        HAVING COUNT(*) = 1
    )
WHERE g.guest_id IN 
(
    SELECT d.guest_id
    FROM guest_data d
    INNER JOIN host_data h ON d.guest_nm=hhost_nm
    GROUP BY h.venue_nm
    HAVING COUNT(*) = 1
)

我希望这足够接近以提供帮助......

【讨论】:

    【解决方案2】:

    在 Sql Server 中,你会做类似的事情

    更新客人 设置链接 ID = 主机 ID 来自客人 g ...

    我从来没有用过mysql,所以祈祷吧。

    【讨论】:

      【解决方案3】:

      在查看了一些语法之后,我决定分解操作并使用相同的 SELECT 查询来插入临时表。然后我使用典型的 JOIN 语法执行了 UPDATE。

      这还有一个额外的好处是能够在推送到您的表之前验证查询结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-09
        • 1970-01-01
        • 2018-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多