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

Moa*_*oak 1 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
Run Code Online (Sandbox Code Playgroud)

现在我无法更新 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
Run Code Online (Sandbox Code Playgroud)

kel*_*oti 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
)
Run Code Online (Sandbox Code Playgroud)

在检查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
)
Run Code Online (Sandbox Code Playgroud)

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