2011-07-22 64 views
0

我正在使用MySql 5.1。我必須將數據庫表Users和Users_group_mapping。這個UPDATE操作的SQL查詢是什麼?

User Table : 
    userid, username, points 
    1  user1  10 
    2  user2  21 
    3  user3  7 
    4  user4  44 

Users_group_mapping Table : 
    userid, usergroupid 
    1  1 
    2  2 
    4  2 
    4  1 
    4  3 

而在分配過程中,我必須分配點,以相應的組用戶。 對於測試數據是這樣的:

Data : $dtArr = array(
    [1] => 40, 
    [2] => 80, 
    [3] => 100 
) 

在陣列$ dtArr,關鍵是在Users_group_mapping表屬性「usergroupdid」和值是在用戶表被更新的屬性點。

例如如果usergroupid = 2並且指定的分數= 40 那麼從Users_group_mapping表中,用戶組'2'中的用戶 - 即用戶標識'2'&'4' - 兩個用戶都將獲得40分。 即使用戶也屬於usergoups'1'&'3',userid'4'將只獲得通過用戶組'2'分配的40個點。

這個操作的SQL更新查詢是什麼?

請指導我.. !!提前致謝。!!

+0

在「例如,如果groupid = 2並且指定給予= 40那麼」,你的意思是80而不是40?你試過什麼了?你使用什麼數據庫(SQL Server,Oracle,MySQL)? – shahkalpesh

+0

你使用哪種語言?如果它必須是SQL,那麼你的分配數據應該在sql表中 – gorn

+2

另外如果你只想要第一次出現,你應該告訴你按照哪個順序分配點。在$ dtArr或Users_group_mapping表中?如果第二種方法比我推薦向Users_group_mapping – gorn

回答

1

如果您擁有數據庫中的所有內容,並且如果您確實想按照表 Users_group_mapping給出的順序執行此操作,則應該將序列列添加到此表並創建新表Data。所以,你有這樣的事情:

User Table : 
    userid, username, points 
    1  user1  10 
    2  user2  21 
    3  user3  7 
    4  user4  44 

Users_group_mapping Table : 
    userid, usergroupid rowseq 
    1  1   1 
    2  2   2 
    4  2   3 
    4  1   4 
    4  3   5 

Data Table : 
    usergroupid, points 
    1    40 
    2    80 
    3   100 

比你需要如下的SQL:

UPDATE User 
    JOIN Users_group_mapping USING (userid) 
    JOIN Data on Data.usergroupid=Users_group_mapping.usergroupid 
    LEFT JOIN Users_group_mapping as x ON x.userid=User.userid and x.rowseq < Users_group_mapping.rowseq 
    SET User.points = User.points + Data.points 
    WHERE x.userid IS NULL 

,如果你不想添加點已經存在的點,而是將它們設置,當然比用

UPDATE User 
    JOIN Users_group_mapping USING (userid) 
    JOIN Data on Data.usergroupid=Users_group_mapping.usergroupid 
    LEFT JOIN Users_group_mapping as x ON x.userid=User.userid and x.rowseq < Users_group_mapping.rowseq 
    SET User.points = Data.points 
    WHERE x.userid IS NULL 

編輯

這裏,如果你不能改變數據結構

$userids[] = array(); 
$result = mysql_query("SELECT * FROM User"); 

while ($row = mysql_fetch_assoc($result)) { 
    $userids[] = $user_row['userid']; 
}; 

foreach($userids as $userid) { 
    $result = mysql_query("SELECT usergroupid FROM Users_group_mapping WHERE userid = $userid"); 
    $row = mysql_fetch_assoc($result)); # we only need first matching row so no cycle 
    $usergroupid = intval($row['usergroupid']); 
    $points = $dtArr[$usergroupid]; 
    mysql_query("UPDATE User SET points = points + $points WHERE User.userid = $userid"); 
}; 

請勿雖然代碼是正確的,因爲它是不是很難解決這個問題,會有一些解決方案(PHP + MYSQL)愚蠢的錯誤(語法錯誤等),因爲我沒有時間去調試它。但它應該給你你的答案。

+0

我無法對上述數據庫表的結構進行任何更改,並且data_array $ dtarr僅適用於PHP。 – Vinay

+0

好吧,比我會重寫它在PHP中,但我仍然認爲,在你的數據中包含rowseq是一件好事。如果有一天您需要更改Users_group_mapping表中的序列,該怎麼辦? – gorn

+0

錯誤 - 只有一個問題:對於第2組,您有80分,爲什麼要將40分送給用戶?如果應該除以用戶數量? – gorn