嗨,我有2个表:user_badges
和badges
表,以下是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应用程序,需要解决此问题的方法......
答案 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等)执行:
points_earned >= required_points
确定使用哪些徽章。user_badges
将新徽章插入INSERT IGNORE INTO user_badges ...
;这样可以确保只添加新徽章,并且不会覆盖现有徽章。