我正在尝试使用基于我存储在另一个表中的数据的“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
答案 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