使用连接和分组的复杂更新

时间:2011-01-20 05:38:25

标签: mysql join group-by

此查询从两个表中选择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

3 个答案:

答案 0 :(得分:5)

您可能遇到的一个问题是每个guest虚拟机可能有多个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
)

我希望这足够接近帮助......

答案 1 :(得分:0)

在Sql Server中,您可以执行类似

的操作

更新客人 SET link_id = host_id 来自客人g ...

我从未使用过mysql,所以手指交叉。

答案 2 :(得分:0)

在查看了这个语法之后,我决定拆分操作并使用相同的SELECT查询来INSERT INTO临时表。然后我使用典型的JOIN语法执行UPDATE。

这样做的另一个好处是能够在推送到您的表之前验证查询结果。