从大MLM数据中选择数据

时间:2018-01-03 12:14:53

标签: php mysql

我想我需要一些建议才能解决我的问题。我有一个使用PHP和MySQL的MLM应用程序。问题出在成员模式中。案例如下:

  1. 每位家长最多可以有10个孩子,每个孩子最多可以有10个孩子。
  2. 在我的申请中,每个试图注册的人都需要推荐,这意味着需要父母。
  3. MLM系统只支持10个级别,这意味着一个人可能有10.000.000.000下线。
  4. 这是主要案例。如果有一个有10个孩子的父母,并且有人试图在该父母推荐中注册(这意味着父母将有11个孩子),那么那些人将成为10个孩子中的一个的granchild。
  5. 插图:

    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个孩子,那么新成员将是孙子。有人可以帮帮我吗?

1 个答案:

答案 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密集型父查询)

该代码尚未经过测试,但仅用于引导您更快速地解决问题。在安全性和稳定性方面也需要改进。