我想我需要一些建议来解决我的案子。我有一个使用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个孩子,新成员将是孙辈。有人能帮我吗?
发布于 2018-01-03 13:00:51
在不查询数据库的情况下,您无法评估一个空闲的"spot“,但是可以通过选择具有特定层次结构级别的"spot”的所有用户来减少查询的数量,而不是单独查询每个父级:
$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个快速的,但更多的内存密集型父查询)
该代码还没有经过测试,但只是为了引导您找到一个更快的解决方案。在安全和稳定方面也需要改进。
https://stackoverflow.com/questions/48077203
复制相似问题