我正在尝试更新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
答案 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;
找到引用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 )
关于如何制作此功能,请参阅上面提供的链接。