我正在使用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查询是什么?
请指导我.. !!提前谢谢。!!
答案 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");
};
请注意,虽然代码是正确的,因为解决这个问题并不困难,但是会有一些愚蠢的错误(语法错误等),因为我没有时间调试它。但它应该给你答案。