2015-11-07 153 views
0

我正嘗試使用基於我已存儲在另一個表中的數據的'if'語句更新我的表,名爲user_results。一些背景:用戶正在做他們的每週選秀(比賽1,比賽2等),我想匹配結果與看看是否應該獎勵點數。如果他們拿到了選秀權,他們下注的積分將被獎勵(積分1,積分2等),並且所有積分將在第1周的user_results表中更新。使用if語句更新sql表格

這裏是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服務器版本正確的語法使用手動附近「如果user_week1_picks.game1 =新英格蘭愛國者然後 集week1 = points1 」第2行

我想要的結果是所有的週報比分爲玩家們通過這個查詢的計算所以它會是這個樣子:

username week1 week2 
jake25  9  0 
test24  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,我們用UPDATE關鍵字替換SELECT ... FROM,並添加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 
+0

是有在那裏是一個問題,並感謝答覆。我想這比我想象的要複雜得多。對於最後一部分,它看起來會運行,直到出現語法錯誤的GROUP BY部分。任何想法?看起來我已經爲自己的工作做好準備,瞭解sql以及如何運行此查詢。非常感謝你的幫助! – jake25

+0

最後一個SELECT查詢是通過用戶名獲得「總分」的一種方式的示例,但它有一些問題。 'LEFT'關鍵字可以省略,不需要將它作爲外連接,也沒有連接謂詞。因此,'LEFT'關鍵字可以用'CROSS'關鍵字替代,表示'week1_picks'中的每一行匹配'nfl_schedule(兩個表中的「跨產品」)中的每一行。也。 SELECT列表中的「r.week1」無效,應該刪除。並且's.game'應該被移除。首先編寫查詢以返回單個行,獲取工作 – spencer7593

+0

並進行測試,驗證結果。然後從這裏開始,您可以添加GROUP BY和SUM()聚合,以便將單個行摺疊爲單行(通過用戶名),並從摺疊後的行中返回總數。如果您只是在學習SQL,那麼我會建議您在處理「計算總分」問題之前開始處理一些簡單問題的查詢。 (這個問題由於表格的設計而變得複雜,如果'week1_picks'表格被標準化,每個遊戲都有一個單獨的行,以及一個單獨的「預測」和「點數」列,那將會更簡單。 – spencer7593