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

What whould Be The Best Method To Count From Child To Last Parent Entries In Database

我需要在检索父类别时计算用户在一个或多个子类别中编辑的所有 post post。

就像我有一个 table 'categories',

ID    Parent_ID
1     0
2     1
3     1
4     2

其他table'posts'

P_ID  P_CONTENT  CAT_ID
1     blah blah  2
2     blah blah  4

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

现在我的问题是计算所有 post 到父类别。

喜欢在检索父类别时将类别 4 和类别 2 的所有 post 计入父类别。

坦率地说,我没有尝试任何事情,因为我的思维在这种情况下无法正常工作,我无法做出任何逻辑,而且我不是查询方面的专家。希望大家理解。谢谢!

鉴于您上面的 table 结构,获得最多 n 个父 ID 的唯一方法是遍历您的父 ID,直到没有更多。您不能使用 MySQL 中的单个查询来执行此操作。如果您必须在数据库中执行此操作,则需要使用存储过程来在 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 使用一些虚构的数据