使用if语句更新sql表

时间:2015-11-07 21:16:56

标签: mysql

我正在尝试使用基于我存储在另一个表中的数据的“if”语句来更新名为user_results的表。一些背景:用户正在进行他们的每周选秀(game1,game2等),我希望将选秀权与结果相匹配,以确定是否应该获得积分。如果他们获得了正确的选择权,他们将下注的积分数量(积分1,积分2等)将全部在第1周的user_results表中更新。

以下是week1_picks表的示例:

username     game1             points1     game2             points2
jake25    New England Patriots   4      Green Bay Packers     5
test24    Pittsburgh Steelers    1      Chicago Bears         1

这是nfl_schedule表的样子:

 game  away                    home                      winner
 1   Pittsburgh Steelers  New England Patriots   New England Patriots
 2   Green Bay Packers      Chicago Bears        Green Bay Packers

尝试测试它的一部分只是为了让某些东西起作用,我试过了:

update user_results
    if user_week1_picks.game1 = New England Patriots then
        set week1 = points1 
        where username = user_results.username; 
else 
    set week1 = 0
    where username = user_results.username;

我不断收到错误消息:#1064 - 您的SQL语法错误;查看与您的MySQL服务器版本对应的手册,以便在'if user_week1_picks.game1 = New England Patriots附近使用正确的语法         设置week1 = points1 '第2行

我希望的结果是所有玩家的每周得分都是通过这个查询来计算的,所以它看起来像这样:

username week1 week2
jake25     9     0
test24     0     0

1 个答案:

答案 0 :(得分:0)

那里有问题吗?或者您提供状态报告?

根据MySQL参考手册,MySQL正在返回该特定错误,因为SQL文本的语法(实际上)无效。

参考:MySQL Reference Manual 13.2.11 UPDATE Syntax http://dev.mysql.com/doc/refman/5.6/en/update.html

要执行您似乎正在描述的操作,您将使用如下语法:

  UPDATE user_results r
     SET r.week1 = expr
   WHERE r.username = 'yosemite sam'

表达式expr可以使用(有效)MySQL语法,包括IF()函数或更多ANSI标准CASE表达式。

但看起来您想要引用其他表中列的值。为此,您可以使用子查询,但看起来更像是您想要使用UPDATE语句的多表格形式。

最简单的方法是编写一个返回要更新的列的SELECT语句,以及一个返回要分配的新值的表达式。

获得game1结果,如下所示:

  SELECT r.username
       , r.week1
       , IF(s1.winner=p1.game1, p1.points1, 0) AS week1_newval
    FROM user_results r
    LEFT JOIN nfl_schedule s1  ON s1.game = 1 
    LEFT JOIN week1_picks  p1  ON p1.username = r.username

您还希望获得game2,game3等结果。对此的SQL将更加复杂,主要是因为week1_picks表没有为每个游戏(1,2)分别拥有行......并且您希望获得总计。所以我们必须适应更复杂的SQL。我们可以通过几种方式来实现这一目标。但我们暂时不会讨论这个问题。

要将该SELECT语句转换为多表UPDATE,我们将SELECT ... FROM替换为UPDATE关键字,并添加SET子句以将表达式的结果分配给我们要更新的专栏。

例如:

  UPDATE user_results r
    LEFT JOIN nfl_schedule s1  ON s1.game = 1 
    LEFT JOIN week1_picks  p1  ON p1.username = r.username
     SET r.week1 = IF(s1.winner=p1.game1, p1.points1, 0)

这只是我们如何将SELECT语句转换为UPDATE语句的示例。首先将它写为SELECT语句让我们返回我们将要更新的行,当前值以及我们要分配的新值。这让我们看到了最新情况,并帮助我们开发查询条件和表达式以获得我们想要的结果。

您需要的SELECT语句比简单示例更具参与性,因为您想要检查多个游戏。要获得总分,我们可以使用GROUP BY子句和SUM()聚合,我们可能会想要在内联视图中执行此操作...的:

  SELECT r.username
    FROM user_results r
    JOIN ( SELECT p.username
                , s.game
                , r.week1
                , SUM( 
                    CASE s.game
                    WHEN  1 THEN IF(p.game1=s.winner,p.points1,0) 
                    WHEN  2 THEN IF(p.game2=s.winner,p.points2,0)
                    WHEN  3 THEN IF(p.game3=s.winner,p.points3,0)
                    WHEN  4 THEN IF(p.game4=s.winner,p.points4,0)
                    ELSE 0 
                    END
                  ) AS total_earned_points 
             FROM week1_picks p 
             LEFT
             JOIN nfl_schedule s
           GROUP BY p.username
         ) q
      ON q.username = r.username 
   ORDER BY r.username