【问题标题】:What will be the SQL query for this UPDATE operation?这个 UPDATE 操作的 SQL 查询是什么?
【发布时间】:2011-07-22 21:38:53
【问题描述】:

我正在使用 MySql 5.1。我必须数据库表用户和用户组映射。

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中,key是Users_group_mapping表中的'usergroupdid'属性,value是Users表中要更新的属性点。

例如如果 usergroupid = 2 并且要给出的点数 = 40 然后从 Users_group_mapping 表中用户组“2”中的用户 - 用户 ID 为“2”和“4” - 两个用户每个都将获得 40 分。 用户 ID '4' 将仅获得通过用户组 '2' 分配的 40 点,即使该用户也属于用户组 '1' 和 '3'。

此操作的 SQL 更新查询是什么?

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

【问题讨论】:

  • 在“例如 if groupid = 2 and points to be given = 40 then”中,您的意思是 80 而不是 40?你试过什么了?您使用的是什么数据库(SQL Server、Oracle、mysql)?
  • 您使用哪种语言?如果必须是 SQL,您的分配数据应该在 sql 表中
  • 此外,如果您只想要第一次出现,您应该告诉您分配点的顺序。在 $dtArr 或 Users_group_mapping 表的顺序中?如果第二个是正确的,我建议将排序列添加到 Users_group_mapping
  • 你不能只用一个更新来完成所有的事情,你应该写一个更新语句的小循环,将“已经更新”的用户ID存储在某个地方,这样你也可以检查他们是否可以获得更多积分
  • 好吧,如果数据在数据库表中,您可以一次更新,但迭代方法对您来说可能更容易。我可以帮忙,但你应该回答上面的问题。

标签: sql sql-update


【解决方案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");   
};

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

【讨论】:

  • 我无法对上述数据库表的结构进行任何更改,并且我只能在 PHP 中使用 data_array $dtarr。
  • 好吧,我会用 php 重写它,但我仍然认为,在数据中包含 rowseq 是件好事。如果有一天您需要更改 Users_group_mapping 表中的顺序怎么办?
  • Errr - 只有一个问题:第 2 组有 80 分,为什么要给用户 40 分?如果应该除以用户数?
  • 我已经发布了我的第二个解决方案。第二组的每个人都得到 80。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
相关资源
最近更新 更多