count id,insert,然后在同一个表mysql的另一列中按数字范围更新

时间:2017-03-04 13:54:54

标签: php mysql cron

我正在尝试更新db中的级别,如下所示: “来自users表的count(id),其中referral_id = id作为aggref set agg_referral = aggref AND level = 1如果aggref在1到3之间” 到目前为止我知道但没有成功:(

这是我的数据库结构 用户表:

  id (AI)      name       Referral id      agg_referral   Level
=========== ========== ================== ============== ======
     1        user A          0                 0          0
     2        user B          3                 0          0
     3        user C          1                 0          0
     4        user D          3                 0          0

这是我使用cron job运行的代码:

  <?php
    include( $_SERVER['DOCUMENT_ROOT'] . '/config.php' );
    mysql_connect(DB_HOST,DB_USER,DB_PASS);
    mysql_select_db(DB_NAME);
    $query="UPDATE users SET agg_referral = (SELECT COUNT(id) from users WHERE users.referral_id = users.id)";
    mysql_query($query);

    ?>
  

我期待这样的结果

 id (AI)      name       Referral id      agg_referral   Level
=========== ========== ================== ============== ======
     1        user A          0                 0          0
     2        user B          3                 0          0
     3        user C          1                 2          1
     4        user D          3                 0          0

2 个答案:

答案 0 :(得分:1)

在MySQL中,您可以通过使用子查询计算每个id的引用数来实现此目的。然后在update

中使用该信息
UPDATE users u JOIN
       (SELECT referral_id, COUNT(*) as cnt
        FROM users u
        GROUP BY referral_id
       ) ur
       ON u.id = ur.referral_id
    SET u.agg_referral = ur.cnt,
        u.level = (CASE WHEN ur.cnt BETWEEN 1 and 3 THEN 2 ELSE level END);

答案 1 :(得分:1)

您可以使用更新加入:

update users u1
join (
    select referral_id,
        count(*) cnt
    from users
    group by referral_id
    ) u2 on u1.id = u2.referral_id    
set u1.agg_referral = u2.cnt,
    u1.level = case 
        when cnt < 1
            then 0
        else ceil((- 5 + sqrt(25 + 8 * cnt)) / 2)
        end;

give a clearer error

找到引用id的时间,然后将其与表连接以更新计数和级别。

对于cnt = 0或更小,case语句产生0,对于cnt在1和3之间产生1,对于cnt在4和7之间产生2。 。等等。

要详细了解公式的工作原理,请参阅Demo

编辑:

如果您的初始组大小不是3,请使用此值来获取所需的公式:

ceil((1 - 2 * g + sqrt(4 * g * g + 1 - 4 * g + 8 * cnt)) / 2)

其中g是该组的初始大小。

对于g = 3,它解决了:

ceil( -5 + sqrt(25 + 8 * cnt) / 2 )

对于g = 10,它解决了:

ceil( -19 + sqrt(361 + 8 * cnt) / 2 )

关于如何制作此功能,请参阅上面提供的链接。