我想我需要一些建议才能解决我的问题。我有一个使用PHP和MySQL的MLM应用程序。问题出在成员模式中。案例如下:
插图:
A(父母)
A1,A2,A3,A4,A5,A6,A7,A8,A9,A10。 (儿童)
然后,有一个人想要注册成为A的孩子(A11),那么系统必须检测A是否有10个孩子(最大)并且A11将成为A1的孩子(如果A1还没有10个孩子)。但如果A1已经有10个孩子,那么A11将成为A2的孩子,依此类推。
主要问题是,如果我从数据库中选择数据,如:
<?php
$sql = mysql_query("SELECT * FROM table WHERE refferal='A'");
if(mysql_num_rows($sql) >= 10) {
/* Another Select with Loop */
}
?>
如果应用程序已经拥有大数据,那将会减慢应用程序的速度。然后,我该怎么办?我只想检查父母是否已经有10个孩子,新成员将是孙子,但如果每个孩子已经有10个孩子,那么新成员将是孙子。有人可以帮帮我吗?
答案 0 :(得分:0)
您无法在不查询数据库的情况下评估免费“点”,但您可以通过选择具有特定层次结构级别的免费“点”的所有用户来减少查询数量,而不是单独查询每个父级:
$parents = NULL;
do {
if ($parents === NULL) {
$parentsQuery = 'SELECT t.user_id FROM table_name as t WHERE t.parent_id IN [' . implode(',', $parents) . '];';
$parentResult = msqli_query($dbConnection, $parentQuery);
$parents = $parentResult->fetch_all();
$parents = array_map(function($parentRow){
return $parentRow['user_id'];
}, $parents);
} else {
$parents = [$_POST['parent']];
}
$query = 'SELECT parent.user_id FROM table_name as parent JOIN table_name as child ON child.parent_id = parent.user_id WHERE parent.user_id IN [' . implode(',', $parents) . '] AND count(child.*) < 10 GROUP_BY parent.user_id ORDER BY parent.user_id;';
$result = msqli_query($dbConnection, $query);
while ($result->num_rows === 0 && !empty($parents));
// First parent that has less than 10 children
$parent= mysqli_fetch_assoc($result)['user_id'];
代码可能会减少运行时间,但是循环需要更深的时间仍然会变慢。 由于最大嵌套级别,此代码将在您的数据库上运行最多20个查询。 (10个子查询,在更深层次上是非常负载密集的,10个快速但更多RAM密集型父查询)
该代码尚未经过测试,但仅用于引导您更快速地解决问题。在安全性和稳定性方面也需要改进。