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

时间:2015-04-27 14:31:20

标签: 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的所有帖子计入父类别。

坦率地说,我没有尝试任何事情,因为我的思想在这种情况下没有工作,我无法做出任何逻辑,我不是那么专业的查询。希望你们明白。谢谢!

1 个答案:

答案 0 :(得分:1)

鉴于上面的表结构,获得最多n个父ID的唯一方法是查看您的父母,直到没有更多。您无法在MySQL中使用单个查询执行此操作。如果必须在数据库中执行此操作,则需要使用stored to procedure来保持在存在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使用一些补充数据