mysql - 在数据库中从子项到最后一个父项进行计数的最佳方法是什么

标签 mysql database

我需要在检索父类别时对一个或多个子类别中的用户发布的所有帖子进行计数。

就像我有一个表“类别”,

ID    Parent_ID
1     0
2     1
3     1
4     2

其他表“帖子”

P_ID  P_CONTENT  CAT_ID
1     blah blah  2
2     blah blah  4

用户在必须有父级的任何子类别下提交帖子。 子类别可能是 4 个或 2 个或任何一个。

现在我的问题是计算所有父类别的帖子。

就像在检索父类别时将类别 4 和 2 的所有帖子计入父类别一样。

坦白说,我没有尝试任何东西,因为我的头脑在这种情况下不起作用,我无法做出任何逻辑,而且我在查询方面也不是那么专家。希望大家理解。谢谢!

最佳答案

鉴于上面的表结构,获取第 n 个父级 id 的唯一方法是查看您的父级,直到没有更多父级。您无法通过 MySQL 中的单个查询来完成此操作。如果必须在数据库中执行此操作,则需要使用存储过程来在存在parent_id 时继续获取parent_id。

此存储过程将计算给定类别的最顶层父级。

drop function getlastancestor;
delimiter $$
create function getlastancestor(cat_id int) returns int
deterministic
begin
  declare anc int; -- variable to hold our ancestor
  declare cur int; -- current ancestor we are looking at
  set anc = cat_id; -- initialise it to the category_id we are checking
  set cur = cat_id; -- same again
  while cur > 0 do  -- exit our loop when we find a parent_id = 0
    select ifnull(parent_id, 0) into cur
      from
        (select parent_id
          from categories
          where id = cur) q;    -- find the parent_id of our current ancestor
    if cur > 0 then
      set anc = cur;            -- if it has one, then we update our ancestor to its value
    end if;
  end while;
  return anc;     -- return the top most ancestor
end $$
delimiter ;

你会像这样使用它:

select getlastancestor(cat_id) parent, count(*) cnt
  from posts
  group by getlastancestor(cat_id);

demo fiddle使用一些虚构的数据

关于mysql - 在数据库中从子项到最后一个父项进行计数的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29898614/

相关文章:

mysql - 按字段内出现的频率排序

php - mysql 请求逻辑

database - Postgresql 相当于一个访问自动编号字段

MySQL数据库数据类型

python - 如何在 Django 项目中使用 MYSQL 作为数据库?

MySQL 没有从索引中选择正确的行数

mysql - 如何根据日期时间字段和间隔字段使用 Laravel 和 MySQL 选择行

php - 允许用户每小时提交一次输入?

database - 限制与另一列条目相关的重复条目

python - 通过Python查询时如何查看MySQL格式的日期时间?