这个UPDATE操作的SQL查询是什么?

时间:2011-07-22 12:12:18

标签: sql database-update

我正在使用MySql 5.1。我必须使用数据库表Users和Users_group_mapping。

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',值是要在Users表中更新的属性点。

e.g。如果usergroupid = 2且指定给定= 40 然后从Users_group_mapping表中用户组'2'中的用户 - 这是用户'2'和& '4' - 两位用户各获得40分。 即使用户属于usergoups'1',也可以通过用户组'2'获得仅40分的用户ID'4'。 '3'也。

此操作的SQL Update查询是什么?

请指导我.. !!提前谢谢。!!

1 个答案:

答案 0 :(得分: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

修改

如果你不能改变数据结构(php + mysql)

,这是解决方案
$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");   
};

请注意,虽然代码是正确的,因为解决这个问题并不困难,但是会有一些愚蠢的错误(语法错误等),因为我没有时间调试它。但它应该给你答案。