Php 根据另一个表的值有条件地更新一个表
您好,我有两个表:Php 根据另一个表的值有条件地更新一个表,php,mysql,Php,Mysql,您好,我有两个表:user\u-badges,和badges表,下面是user\u-badges表数据: id | user_id | badge_id | points_earned | badges_awarded | 1 2324 0 5 0 如果用户满足最低要求分数,即徽章表中的5分,SQL将更新上述内容: id | user_id | badge_id | points_earned | badges_awar
user\u-badges
,和badges
表,下面是user\u-badges
表数据:
id | user_id | badge_id | points_earned | badges_awarded |
1 2324 0 5 0
如果用户满足最低要求分数,即徽章表中的5分,SQL将更新上述内容:
id | user_id | badge_id | points_earned | badges_awarded |
1 2324 1 5 1
如果将来为同一用户注册了新点,user\u table
badges将添加新行,如下所示:
id | user_id | badge_id | points_earned | badges_awarded |
1 2324 1 5 1
2 2324 0 7 0
上述问题已经解决
这是徽章
表:
badge_id | badge_name | required_points
1 new 5
2 adv 10
下面是我需要的
问题是我需要一个查询来比较用户_徽章
表和徽章
表,前提是查询必须知道这些徽章之前是否授予过
我将此用于Zend应用程序,需要此问题的解决方案…以下是一些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中进行检查,并在需要时随时进行更新。如果我正确理解您的问题,首先您需要获取尚未获得徽章的用户,然后使用correlated子查询
您需要使用badges
表中相应的最高有效badges\u id
更新表user\u-badges
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);
我不会记录在用户卡
表中获得的积分,而是将它们保存在其他位置,可以是用户卡
表中,也可以是单独的用户卡
表中。这使得只需一个简单的更新就可以更容易地更新自己的点。。。设置赢得的积分=赢得的积分+:积分
接下来,我将把user\u徽章
表简化为:
user_id | badge_id
使用跨越唯一
索引确保用户不能拥有每个徽章中的多个徽章
最后,更新user_-badges
表可以作为后台任务(cron等)执行,步骤有两个:
使用积分\u挣来的>=必需的\u积分
识别已获得的徽章
使用在用户卡中插入忽略…
将新卡插入用户卡中
;这样可以确保只添加新的徽章,而不会覆盖现有的徽章
根据您正在尝试的操作,您似乎没有正确的数据库设计。在我看来,你似乎在试图根据用户的分数找到最先进的徽章。为此,您所需要的只是徽章
表和存储在用户
表中的一列中的用户点数,然后您只需进行查询,找出所需点数小于用户当前点数的所有徽章,即可列出该用户的徽章。我发现很难理解这个问题。你能再解释一遍吗?你到底想比较什么?另外,请提供具有匹配值的表数据。无论如何,您可以延长截止日期吗?上面说3小时后结束。。。但是,我在办公室,我可以回答,但是,回家后。。。有延期的机会吗?