【问题标题】:Query only specified number of items from parent/child categories仅从父/子类别中查询指定数量的项目
【发布时间】:2010-05-25 02:01:06
【问题描述】:

我无法弄清楚如何查询某个类别中的每个项目,并且只按日期列出最新的 10 个项目。这是我的表格布局:

download_categories

category_id (int) primary key
title (var_char)
parent_id (int)</pre></code>

downloads

id (int) primary key
title (var_char)
category_id (int)
date (date)</pre></code>

我需要查询一个主类别中的每个文件,比如说,有 100 个项目和 5 个子类别,并且只输出最后添加的 10 个。我现在有函数可以将所有文件相加,这样我就可以按类别进行计数,但我似乎无法修改代码以仅根据日期显示一定数量的项目。

我修改了用于计算一个类别及其子类别中的所有文件以列出文件的代码。主要问题是当我在我的 SQL 中添加一个 LIMIT 子句时,它只是限制了从该类别列出的结果,而不是整个查询。

代码将所有下载类别放在一个数组中,然后循环遍历每个类别,查询具有该 category_id 的下载。

我最好的选择是将结果放在一个数组中,然后从那里排序吗?

function list_cat_files($parent, $start) {

    global $menu_array;

    if($start == 1) {

        unset($GLOBALS["total"]);

        $query = mysql_query("SELECT * FROM download_categories");

        while ( $row = mysql_fetch_assoc($query) ) {

            $menu_array[$row['category_id']] =
              array(
                'name'        => $row['title'],
                'parent'      => $row['parent_id'],
                'category_id' => $row['category_id']);

        }
    }

    foreach($menu_array as $key => $value) {

        global $total;

        if ($value['parent'] == $parent) {

            $category_id = $value['category_id'];

            $query1 = mysql_query("SELECT lid AS id, title, date, category_id FROM downloads WHERE category_id='$category_id'");

            while($item = mysql_fetch_array($query1)) {

                $total .= "--- ($item[lid]) : $item[title] <BR><BR>";
            }

            list_cat_files($key, 0);
        }
    }
    return $total;
}

【问题讨论】:

  • 类别has 100 items是否意味着100条下载记录的downloads.category_id等于类别的id?或者这 100 个计数是否还包括属于该类别的子类别的任何项目?我可以更混乱地表述这个评论吗?
  • 这意味着下载也属于子类别。我在想我必须递归地遍历每个项目并将其放入一个大数组中,然后从那里排序。

标签: php mysql parent-child


【解决方案1】:

这样的东西会有帮助吗?假设 $categories 是您想要的类别 ID 的数组。

$query = FALSE;


foreach ($categories as $category){
    $query .= $query ? ' UNION ': '';

    $query .= "SELECT * from `downloads`
        WHERE category_id=$category order by date limit 10\n";

}

// run query here

如果它有帮助,当我处理复杂的类别结构时,我就是这样处理它的。我会做尽可能多的查询,以使作为开发人员的我能够轻松地对其进行排序。螺丝性能。然后我根据需要缓存输出并将缓存的文件用于公共消费。类别不会经常更改,因此这些资源密集型查询仅在管理员更改内容时偶尔运行,并且一次仅由 1 人运行,而不是所有访问者。

【讨论】:

    【解决方案2】:
    select * from downloads where category_id=X order by date limit 10
    

    对每个类别重复。除非你想实现嵌套集/modified preorder tree traversal(MPTT):http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

    【讨论】:

    • 我当然知道如何从某个类别查询,但它也需要遍历所有子类别。我正在阅读该页面,但它似乎只谈论查询其他类别,而不是与他们关联的项目?
    • Mysql 至少不允许递归查询。您必须以编程方式进行,循环遍历子类别。
    猜你喜欢
    • 2020-09-14
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2010-12-30
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    相关资源
    最近更新 更多