从多个表中计算日期的新字段:更新还是过程?

时间:2015-05-26 15:57:55

标签: mysql sql

我对SQL很新,并尝试根据3个非常大的数据库表计算新字段。这是一个抽象:

  • 表1:玩家(包含生日DATE字段)
  • 表2:锦标赛(包含DATETIME字段)
  • 表3:游戏(具有引用players.id和tournaments.id的外键)

我想在游戏表中添加一个字段,其中包含玩家在锦标赛当年的年龄的十进制表示。

我是否需要编写一个过程/操作循环来完成此操作?或者有更新查询的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用UPDATE语句执行此操作。 (但是,你真的想要吗?)

首先,编写可以提供结果的untitled语句。

SELECT

只需添加一个表达式即可执行您要执行的计算,并将其作为列返回。

然后,您可以将该SELECT语句用作UPDATE语句中的内联视图。假设您已在SELECT g.player_id , g.tournament_id , p.birthday , t.tournament_date , DATEDIFF(t.tournament_date,p.birthday) AS days_diff FROM games g JOIN player p ON p.id = g.player_id JOIN tournament t ON t.id = g.tournament_id

中添加了age_in_days
games

接下来,我们必须关注"大"表,并避免产生大量回滚的巨大事务(如果这些是InnoDB表)。

如果这是一个问题,请在"批次"中进行更新操作。通过在内联视图查询中添加谓词(例如UPDATE games d JOIN ( SELECT g.player_id , g.tournament_id , p.birthday , t.tournament_date , DATEDIFF(t.tournament_date,p.birthday) AS days_diff FROM games g JOIN player p ON p.id = g.player_id JOIN tournament t ON t.id = g.tournament_id ) s ON s.player_id = d.player_id AND s.tournament_id = d.tournament_id SET s.age_in_days = s.days_diff ,并为每个WHERE g.player_id = 42运行相同的UPDATE一次来分解它。

如果你希望年龄在"十进制年份",你需要开发一个表达式来返回它。 (作为一个基本的近似值,将天数差异除以一年中的天数player_id。这会让你非常接近。)

(在我回答的开头,我问道,你真的想要吗。

请注意,如果更新了播放器365.25值,或更改了birthday,则tournament_date表中存储的计算值将不一致。

答案 1 :(得分:0)

你可以试试这个

Update games 
set age = (SELECT FLOOR(DATEDIFF(DAY, players.BirthDate, tournaments.datetime) / 365.25) from players,tournaments) 
where players.id=games.id;