Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 根据另一个表的值有条件地更新一个表_Php_Mysql - Fatal编程技术网

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小时后结束。。。但是,我在办公室,我可以回答,但是,回家后。。。有延期的机会吗?