1

我正在开发一个简单的系统,该系统具有无限的类别和每个类别中的项目。例如,类别内可能有类别等(类别 1 -> 类别 2 -> 类别 3)都包含项目。我想显示每个类别及其所有子类别的总项目。我正试图找出一个循环来做到这一点,但基本上是不够的。我在 PHP/MySQL 中构建。我的类别表架构是 category(id, id_parent) id 是自动递增的,id_parent 是它是否位于另一个类别中(默认为 0)。我的项目架构是项目(id,id_category)。显然还有其他专栏,但我相信这些是唯一重要的专栏。有人可以帮我开发一个循环结构,得出他们所在类别的项目总数(也计算所有子类别项目)。

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;
}
4

1 回答 1

1

(嵌套循环/查询有很多方法。结构更改的想法是有一个单独的表,列出每个类别的所有子级。并确保它不仅具有直接子级,还具有子级-children 和 sub-sub-children... 比如 1 有孩子 2,2 有孩子 3,1 有孩子 3,3 有孩子 5,1 有孩子 5.. 等等..)但是,对于目前的情况..

一种循环结构可以是:

启动结果集。|| 查询 parent = 0 的所有类别 ID。|| 将每个添加到数组 (X)。|| 关闭结果集。

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

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

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

  • 启动结果集。|| 查询所有类别 id,其中 parent = 当前 id x || 将所有内容添加到子 ID 数组 (Y)。|| 关闭结果集。

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

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

    • 启动结果集。|| 查询 parent = 当前 id y 的所有类别 id。|| 将所有内容添加到子 ID 数组 (Y)。|| 关闭结果集。

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

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

  • 继续while循环

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

结束for循环

于 2011-10-07T03:55:14.330 回答