首页 > 解决方案 > mySQL 将带有 Join 的 SELECT 转换为更新

问题描述

在一些当之无愧的评论之后,我没有提供足够的细节。我已经重写了我之前删除的问题。

我有两张桌子:

  1. race_results

    系列中每场特定比赛的船只和船长列表。可以有一堆。

    race_idboat_id 点船长 1 45 3 John Doe 2 45 1 Jane Sailor 3 45 6 John Doe 1 51 2 Bob Fast 2 51 3 Bob Fast 3 51 4 Bob Fast

  2. series_results

该表包含系列中的每场比赛以及race_id=99 记录,这是所有比赛的总位置。(不用担心两张表中的积分相同,在某些情况下比赛和系列赛使用不同的公式)

 series_id race_id  boat_id  points skipper
 98        1        45       3
 98        2        45       1
 98        3        45       6
 98        99       45       4
 98        1        51       2
 98        2        51       3
 98        3        51       4
 98        99       51       3      

两个表都有作为船长名称的列。有趣的是,每场比赛的队长都可能不同。所以我想要做的是将series_results表中的船长名称设置为串联skipper列表。这个查询很好地完成了这部分。

SELECT en.boat_id, GROUP_CONCAT(DISTINCT(skipper) SEPARATOR ' & ') as skipper 
FROM series_results sr  
LEFT JOIN race_results rr
ON rr.race_id =sr.race_id  AND re.boat_id=sr.boat_id 
WHERE sr.series_id='98'  
GROUP BY rr.boat_id

在这里,我被卡住的是如何将其转换为适当UPDATEsr.skipper新连接版本。
这是我正在寻找的最终结果。

 series_id race_id  boat_id  points skipper
 98        1        45       3      John Doe & Jane Sailor
 98        2        45       1      John Doe & Jane Sailor
 98        3        45       6      John Doe & Jane Sailor
 98        99       45       4      John Doe & Jane Sailor
 98        1        51       2      Bob Fast
 98        2        51       3      Bob Fast
 98        3        51       4      Bob Fast
 98        99       51       3      Bob Fast 

这个 UPDATE 代码给了我一个语法错误GROUP BY.....

  UPDATE series_results sr  
  LEFT JOIN race_results rr
  ON rr.race_id =sr.race_id  AND re.boat_id=sr.boat_id
  SET sr.skipper= GROUP_CONCAT(DISTINCT(rr.skipper) SEPARATOR ' & ') 
  WHERE sr.series_id='98'  
  GROUP BY rr.boat_id

我尝试了一个相关的子查询,但这只会更新系列表中的race_id 1。我希望所有这些都更新,尤其是 99。

谢谢你的帮助。戴夫

标签: mysql

解决方案


将您的选择查询加入到series_results

UPDATE series_results s INNER JOIN ( 
  SELECT rr.boat_id, sr.series_id, 
    GROUP_CONCAT(DISTINCT(rr.skipper) SEPARATOR ' & ') as skipper 
  FROM series_results sr LEFT JOIN race_results rr
  ON rr.race_id =sr.race_id  AND rr.boat_id=sr.boat_id 
  WHERE sr.series_id = '98'  
  GROUP BY rr.boat_id, sr.series_id
) g ON g.boat_id = s.boat_id AND g.series_id = s.series_id
SET s.skipper = g.skipper;

请参阅演示
结果:

| series_id | race_id | boat_id | points | skipper                |
| --------- | ------- | ------- | ------ | ---------------------- |
| 98        | 1       | 45      | 3      | Jane Sailor & John Doe |
| 98        | 2       | 45      | 1      | Jane Sailor & John Doe |
| 98        | 3       | 45      | 6      | Jane Sailor & John Doe |
| 98        | 99      | 45      | 4      | Jane Sailor & John Doe |
| 98        | 1       | 51      | 2      | Bob Fast               |
| 98        | 2       | 51      | 3      | Bob Fast               |
| 98        | 3       | 51      | 4      | Bob Fast               |
| 98        | 99      | 51      | 3      | Bob Fast               |

推荐阅读