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

d3b*_*g3r 5 php mysql

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

id | user_id | badge_id | points_earned | badges_awarded |
 1    2324        0             5               0
Run Code Online (Sandbox Code Playgroud)

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

id | user_id | badge_id | points_earned | badges_awarded |
 1    2324        1             5               1
Run Code Online (Sandbox Code Playgroud)

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

 id | user_id | badge_id | points_earned | badges_awarded |
  1    2324        1             5               1
  2    2324        0             7               0
Run Code Online (Sandbox Code Playgroud)

上述问题已经解决


这是badges表:

badge_id | badge_name | required_points
   1           new          5
   2           adv          10
Run Code Online (Sandbox Code Playgroud)

以下是我的需要


问题是我需要一个查询来比较user_badges表和badges表,前提是查询必须知道之前是否已经授予了徽章.

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

Ome*_*esh 5

如果我没有理解你的问题,你首先需要获得对他们来说,徽章尚未之前授予的用户,然后使用correlated subquery你需要更新表user_badges与对应的最高有效的badges_idbadges表.

UPDATE user_badges a
       INNER JOIN(SELECT DISTINCT user_id, SUM(badges_awarded) AS total_badges_awarded
                  FROM user_badges
                  GROUP BY user_id
                 ) b
             ON a.user_id = b.user_id
                AND b.total_badges_awarded = 0
SET a.badge_id = (@var_badges_awarded_flag:= (IFNULL((
                             SELECT c.badge_id
                             FROM badges c
                             WHERE a.points_earned > c.required_points
                             ORDER BY c.required_points DESC
                             LIMIT 1
                            ), 0))),
    a.badges_awarded = a.badges_awarded + IF(@var_badges_awarded_flag > 0, 1, 0);
Run Code Online (Sandbox Code Playgroud)


Ale*_*cki 0

以下是一些 SQL 逻辑,可帮助您获取所有用户以及每个用户可以获得的下一个徽章:

SELECT *
FROM user_badges
JOIN badges
ON badges.badge_id = (user_badges.badge_id + 1)
Run Code Online (Sandbox Code Playgroud)

然后,您可以循环浏览每个用户并确定他们的徽章是否需要使用 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']);
    }
}
Run Code Online (Sandbox Code Playgroud)

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