Php MySQL计算所有的孩子,不管有多少

Php MySQL计算所有的孩子,不管有多少,php,mysql,sql,loops,smf,Php,Mysql,Sql,Loops,Smf,我正在开发一个简单的系统,在每个类别中有无限的类别和项目。例如,类别等(类别1->类别2->类别3)中可能有类别,所有这些类别都包含项目。我想显示每个类别及其所有子类别的项目总数。我正试图找出一个循环来做这件事,但基本上是短了。我正在用PHP/MySQL构建。我的类别表架构是类别(id,id\u parent),id是自动递增的,id\u parent是它是否位于另一个类别中(默认为0)。我的项目架构是项目(id,id\u类别)。显然还有其他专栏,但我相信这些是唯一重要的。有人能帮我开发一个循环

我正在开发一个简单的系统,在每个类别中有无限的类别和项目。例如,类别等(类别1->类别2->类别3)中可能有类别,所有这些类别都包含项目。我想显示每个类别及其所有子类别的项目总数。我正试图找出一个循环来做这件事,但基本上是短了。我正在用PHP/MySQL构建。我的类别表架构是类别(id,id\u parent),id是自动递增的,id\u parent是它是否位于另一个类别中(默认为0)。我的项目架构是项目(id,id\u类别)。显然还有其他专栏,但我相信这些是唯一重要的。有人能帮我开发一个循环结构吗?为他们所属的类别列出项目总数(同时计算所有子类别项目)。这是我开始的,尽管我觉得这是非常非常错误的

function CountChildDownloads($id_category)
{
global $smcFunc;
$x = array();
$total = 0;

$request = $smcFunc['db_query']('', '
    SELECT COUNT(*) AS items FROM {db_prefix}xld_downloads
    WHERE id_category = '.$id_category.''
);

$total += $request['items'];

$request = $smcFunc['db_query']('', '
    SELECT id FROM {db_prefix}xld_categories
    WHERE id_parent = '.$id_category.''
);

if($smcFunc['db_num_rows']($request) > 0)  {
    while($row = $smcFunc['db_fetch_assoc']($request)) {
        $x[] = $row['id'];
    }
}

foreach ($x as $id)
{
    $y = array();
    $z = 0;

    $request = $smcFunc['db_query']('', '
        SELECT COUNT(*) AS items FROM {db_prefix}xld_downloads
        WHERE id_category = '.$id.''
    );

    $z += $request['items'];

    $request = $smcFunc['db_query']('', '
        SELECT id FROM {db_prefix}xld_categories
        WHERE id_parent = '.$id.''
    );

    if($smcFunc['db_num_rows']($request) > 0)  {
        while($row = $smcFunc['db_fetch_assoc']($request)) {
            $y[] = $row['id'];
        }
    }

    while (count($y) > 0)
    {
        $id_y = $y[0];

        $request = $smcFunc['db_query']('', '
            SELECT id FROM {db_prefix}xld_categories
            WHERE id_parent = '.$id_y.''
        );

        if($smcFunc['db_num_rows']($request) > 0)  {
            while($row = $smcFunc['db_fetch_assoc']($request)) {
                $y[] = $row['id'];
            }
        }

        $request = $smcFunc['db_query']('', '
            SELECT COUNT(*) AS items FROM {db_prefix}xld_downloads
            WHERE id_category = '.$id_y.''
        );

        $z += $request['items'];

        unset($y[0]);
        array_values($y);
    }

    $total += $z;
}

return $total;
}
$smcFunc只是系统执行查询的方式。它是一个MySQL后端

工作函数(如果不使用SMF,则需要更新为标准MySQL调用)感谢Lucas

function CountChildDownloads($id_category)
{
global $smcFunc;
$x = array();
$total = array();
$total['downloads'] = 0;
$total['views'] = 0;

$request = $smcFunc['db_query']('', '
    SELECT views FROM {db_prefix}xld_downloads
    WHERE id_category = '.$id_category.''
);

if($smcFunc['db_num_rows']($request) > 0)  {
    while($row = $smcFunc['db_fetch_assoc']($request)) {
        $total['downloads']++;
        $total['views'] += $row['views'];
    }
}

$request = $smcFunc['db_query']('', '
    SELECT id FROM {db_prefix}xld_categories
    WHERE id_parent = '.$id_category.''
);

if($smcFunc['db_num_rows']($request) > 0)  {
    while($row = $smcFunc['db_fetch_assoc']($request)) {
        $x[] = $row['id'];
    }
}

foreach ($x as $id)
{
    $y = array();
    $z = 0;
    $w = 0;

    $request = $smcFunc['db_query']('', '
        SELECT views FROM {db_prefix}xld_downloads
        WHERE id_category = '.$id.''
    );

    if($smcFunc['db_num_rows']($request) > 0)  {
        while($row = $smcFunc['db_fetch_assoc']($request)) {
            $z++;
            $w += $row['views'];
        }
    }

    $request = $smcFunc['db_query']('', '
        SELECT id FROM {db_prefix}xld_categories
        WHERE id_parent = '.$id.''
    );

    if($smcFunc['db_num_rows']($request) > 0)  {
        while($row = $smcFunc['db_fetch_assoc']($request)) {
            $y[] = $row['id'];
        }
    }

    while (count($y) > 0)
    {
        $id_y = $y[0];

        if (!empty($id_y))
        {
            $request = $smcFunc['db_query']('', '
                SELECT id FROM {db_prefix}xld_categories
                WHERE id_parent = {int:id_parent}',
                array(
                    'id_parent' => $id_y,
                )
            );

            if($smcFunc['db_num_rows']($request) > 0)  {
                while($row = $smcFunc['db_fetch_assoc']($request)) {
                    $y[] = $row['id'];
                }
            }

            $request = $smcFunc['db_query']('', '
                SELECT views FROM {db_prefix}xld_downloads
                WHERE id_category = {int:id_category}',
                array(
                    'id_category' => $id_y,
                )
            );

            if($smcFunc['db_num_rows']($request) > 0)  {
                while($row = $smcFunc['db_fetch_assoc']($request)) {
                    $z++;
                    $w += $row['views'];
                }
            }
        }

        unset($y[0]);
        $y = array_values($y);

    }

    $total['downloads'] += $z;
    $total['views'] += $w;
}

return $total;
}
(嵌套循环/查询有多种方法..结构更改的想法是有一个单独的表,列出每个类别的所有子项..并确保它不仅有直接子项,还包括子子项和子子子项..就像1有子项2,2有子项3,1有子项3,3有子项5,1有ch第五条……等等……)但是,就目前的情况而言

一个循环结构可以是:

开始结果集。|| 查询父项为0的所有类别ID。| |将每个类别ID添加到数组(X)。| | 关闭结果集

对于数组中的每个id(X):

  • 建立一个新的计数变量(z)
  • 建立新的子id数组(Y)

  • 开始结果集。|| 类别=当前id x | |的所有项目的查询计数* 添加到计数变量(z)| 关闭结果集

  • 开始结果集。|| 查询父项=当前id x | |的所有类别id 将全部添加到子id数组(Y)。|| 关闭结果集

  • 而子数组(Y)长度>0

    • 类别id y=数组中的第一项(y)

    • 开始结果集。|| 查询父项=当前id y.| |的所有类别id 将全部添加到子id数组(Y)。|| 关闭结果集

    • 开始结果集。|| 类别=当前id y | |的所有项目的查询计数* 添加到计数变量(z)| 关闭结果集

    • 从数组中删除第一项(Y)

  • 边循环边继续

  • 此时,您拥有类别id x的最终项目计数(z)…对其进行处理,然后继续for循环

循环结束

(嵌套循环/查询有多种方法..结构更改的想法是有一个单独的表,列出每个类别的所有子项..并确保它不仅有直接子项,还包括子子项和子子子项..就像1有子项2,2有子项3,1有子项3,3有子项5,1有ch第五条……等等……)但是,就目前的情况而言

一个循环结构可以是:

开始结果集。|| 查询父项为0的所有类别ID。| |将每个类别ID添加到数组(X)。| | 关闭结果集

对于数组中的每个id(X):

  • 建立一个新的计数变量(z)
  • 建立新的子id数组(Y)

  • 开始结果集。|| 类别=当前id x | |的所有项目的查询计数* 添加到计数变量(z)| 关闭结果集

  • 开始结果集。|| 查询父项=当前id x | |的所有类别id 将全部添加到子id数组(Y)。|| 关闭结果集

  • 而子数组(Y)长度>0

    • 类别id y=数组中的第一项(y)

    • 开始结果集。|| 查询父项=当前id y.| |的所有类别id 将全部添加到子id数组(Y)。|| 关闭结果集

    • 开始结果集。|| 类别=当前id y | |的所有项目的查询计数* 添加到计数变量(z)| 关闭结果集

    • 从数组中删除第一项(Y)

  • 边循环边继续

  • 此时,您拥有类别id x的最终项目计数(z)…对其进行处理,然后继续for循环


End for loop

您需要PHP响应还是只需要伪代码回答?使用PHP最好是确保我完全理解,但如果是伪代码,我可能能够解决它。无论哪种方式给您带来的不便更少。您需要PHP响应还是只需要伪代码回答?使用PHP最好是确保我完全理解,但如果这是一个伪代码,我也许能找到它。无论哪一个给你带来的不便少一点。警告一句:这不会检查任何无限循环。它可以更改为这样做,但我想提供一个更简单的答案,假设你没有任何无限循环。(例如,1有子5,5有子1)。我用你的技巧修改了我上面的帖子(我相信)当我知道category 2中有1个下载时,如果我对CountChildDownloads(2)进行计数,我仍然会收到一个0的结果。也许可以查看一下,看看我的错误在哪里。我对PHP不是100%熟悉,但我确实注意到一些事情:1)在for循环中,第一个查询应该是$id而不是$category。2)同样的事情,但是对于while循环中的第二个查询,应该是$id_y而不是$category。3)看起来您并不是在将新的子数组添加到(y)数组中,您只是在执行查询,然后继续。---4) 由于您是从categoryid开始的(不仅仅是查看所有类别),因此在开始for循环之前,您需要执行计数并将其添加到总数中。更新原始帖子以修复更改。但是,即使主类别中有1项,子类别中有1项,我仍然收到0响应