根据另一个表的值有条件地更新一个表

时间:2012-08-14 05:12:37

标签: php mysql

嗨,我有2个表:user_badgesbadges表,以下是user_badges表数据:

id | user_id | badge_id | points_earned | badges_awarded |
 1    2324        0             5               0

如果用户满足最低要求点,即badges表中的5,则SQL将更新上述内容:

id | user_id | badge_id | points_earned | badges_awarded |
 1    2324        1             5               1

如果以后为同一个用户注册了新点,user_table徽章将添加一个新行,如下所示:

 id | user_id | badge_id | points_earned | badges_awarded |
  1    2324        1             5               1
  2    2324        0             7               0

上述问题已经解决


这是badges表:

badge_id | badge_name | required_points
   1           new          5
   2           adv          10

以下是我需要的


问题是我需要一个查询来将user_badges表与badges表进行比较,前提是查询必须知道徽章是否已经被授予。

我将它用于Zend应用程序,需要解决此问题的方法......

3 个答案:

答案 0 :(得分:5)

如果我正确理解了您的问题,首先您需要获取之前尚未获得徽章的用户,然后使用correlated subquery您需要更新相应最高有效{{1}的表user_badges来自badges_id表。

badges

答案 1 :(得分:0)

这里有一些SQL逻辑可以让你获得所有用户以及每个用户可以获得的下一个徽章:

SELECT *
FROM user_badges
JOIN badges
ON badges.badge_id = (user_badges.badge_id + 1)

然后,您可以遍历每个用户并确定他们的徽章是否需要使用PHP进行更新:

while ($row = mysqli_fetch_assoc($result)) // where result is the result from running the above query
{
    if ($row["points_earned"] >= $row["required_points"]) // enough points for next badge, update badges
    {
        mysqli_query("UPDATE user_badges SET badge_id = badge_id + 1, badges_awarded = badges_awarded + 1 WHERE user_id = ".$row['user_id']);
    }
}

这只是一些示例SQL / PHP代码,可以帮助您入门。您可以查询所需的行,在PHP中查看它们,并在必要时随时更新它们。

答案 2 :(得分:0)

不是跟踪user_badges表中获得的点数,而是将它们保存在其他位置,无论是在users表内还是在单独的表user_points中。这样,只需简单UPDATE ... SET earned_points = earned_points + :points即可更轻松地更新一个点。

接下来,我会将user_badges表简化为:

user_id | badge_id

使用跨越UNIQUE索引确保用户不能拥有多个徽章。

最后,使用两个步骤更新user_badges表可以作为后台任务(cron等)执行:

  1. 使用points_earned >= required_points确定使用哪些徽章。
  2. 使用user_badges将新徽章插入INSERT IGNORE INTO user_badges ...;这样可以确保只添加新徽章,并且不会覆盖现有徽章。