嗨,我有2个表:user_badges
和badges
表,以下是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应用程序,需要一个解决这个问题的方法......
如果我没有理解你的问题,你首先需要获得对他们来说,徽章尚未之前授予的用户,然后使用correlated subquery
你需要更新表user_badges
与对应的最高有效的badges_id
从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);
Run Code Online (Sandbox Code Playgroud)
以下是一些 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 中检查它们,并根据需要随时更新它们。