【问题标题】:Update table based on conditions from another table,that include functions根据另一个表的条件更新表,包括函数
【发布时间】:2012-12-14 14:55:49
【问题描述】:

我有 2 个 mysql 表,如下例所示:

汽车:

RaceID CarID    Dis Grd Date            Time    
8      1    200 A   2010-10-10  20.50
8      2    300 A   2010-10-10  30.50
8      3    200 A   2010-10-10  20.10
9      1    200 A   2010-11-10  20.00
12     1    200 A   2011-12-11  19.50   

种族:

RaceId  CarID   Dis Grd Date        Exp_Time

10  1   200 A   2011-11-11        
10  2   200 A   2011-11-11        
10  3   200 A   2011-11-11        

我想根据 CARS 表中的数据在 Exp_Time 列的 Races 表中添加数据。 例如:

RACES.Exp_Time=AVG(CARS.Time) 
WHERE
CARS.CarID=RACES.CarID
CARS.Dis=RACES.Dis
CARS.Grd=RACES.Grd
CARS.Date<RACES.Date

这个想法是,预期时间是相同距离和 grd 上之前比赛时间的 AVG。未来的比赛应从计算 AVG 中排除。
问题是从 RACES 表中获取日期条件。 我做这个查询:

UPDATE `RACES` c
INNER JOIN (
SELECT CARS.CarID, CARS.Dis, CARS.Grd, CARS.Date, AVG(Time) AS `Exp_Time`
FROM CARS
WHERE CARS.Date<'2011-11-11'
GROUP BY CarID, Dis, Grd
)
x ON c.CarID=x.CarID AND c.Dis=x.Dis AND c.Grd=x.Grd
SET c.Exp_Time=x.Exp_Time

当我输入 myseld 日期时它可以工作 - 2011-11-11 我不知道如何从 RACES 表中获取数据。

有人可以帮忙吗? 提前致谢! 伊万

【问题讨论】:

    标签: mysql select inner-join where


    【解决方案1】:
    UPDATE `RACES` c
    INNER JOIN (
    SELECT CARS.CarID, CARS.Dis, CARS.Grd, CARS.Date, AVG(Time) AS `Exp_Time`
    FROM CARS
    WHERE CARS.Date < (SELECT  Date 
                       FROM RACES 
                       WHERE    CARS.Date<RACES.Date 
                            AND CARS.Grd=RACES.Grd 
                            AND CARS.CarID=RACES.CarID
                            AND CARS.Dis=RACES.Dis
                            LIMIT 1 
                    )
                    GROUP BY CarID, Dis, Grd
    )
    x ON c.CarID=x.CarID AND c.Dis=x.Dis AND c.Grd=x.Grd
    SET c.Exp_Time=x.Exp_Time
    

    【讨论】:

    • 谢谢,如果我在第二个 SELECT 上添加 LIMIT 1 条件,这将有效,否则会给出一个错误,它发现多个满足条件的结果。当我在 RACES 表中获得超过 1 行满足“ON c.CarID=x.CarID AND c.Dis=x.Dis AND c.Grd=x.Grd”时,就会出现问题。
    • @user1936814 在我的回答中添加LIMIT 1,以便对其他人有所帮助
    【解决方案2】:

    2011-11-11 我不知道如何从 RACES 表中获取数据。

    您可以像这样将此谓词移动到JOIN 条件:

    UPDATE `RACES` c
    INNER JOIN (
      SELECT 
         CarID, Dis, Grd, Date, AVG(Time) AS `Exp_Time`
      FROM CARS
      GROUP BY CarID, Dis, Grd
    )x  ON c.CarID        = x.CarID 
       AND c.Dis          = x.Dis 
       AND c.Grd          = x.Grd
       AND x.DATE(`Date`) < c.DATE(`Date`)
    SET c.Exp_Time = x.Exp_Time;
    

    【讨论】:

    • 好的,谢谢。我实际上尝试过这个,但看起来我遇到了日期问题,因为它没有正确计算。
    • 它将汽车中的所有日期识别为 0000-00-00,即使我将公式设置为 x.DATE(Date) > c.DATE(Date) 它也只返回第一个它根据此条件找到的日期,而不是 AVG。两个字段类型都设置为日期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多