使用嵌套集模型计算辅助表中项目数的SQL查询

时间:2012-12-19 18:56:54

标签: mysql sql

我正在使用嵌套集模型处理类别。我的数据库设计就像这样

  • 表1:类别(id,lft,rgt,count1,count2)
  • 表2:Items1(id,catid,.....) - catid是类别表中的id
  • 表3:Items2(id,item1_id,....) - item1_id是Items 1表中的id

现在,由于Items1有catid列,我可以使用嵌套集模型使用下面的SQL轻松计算树中项目的数量:

        SELECT 
            parent.id, COUNT(items.id) as item_count
        FROM 
            categories AS node ,
            categories AS parent,
            items1 AS items
        WHERE 
            node.nleft BETWEEN parent.nleft AND parent.nright 
            AND node.id = items.catid
            AND items.published = 1
        GROUP BY 
            parent.id
        ORDER BY 
            node.nleft;

并从该SQL更新每个类别。

现在有人可以帮助我如何更新树下每个类别的项目数量,从items2表到count2列?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

这样的内容会将count2设置为items2中引用该类别的行数:

update 
  categories 
set 
  count2=(
    select count(*) from items2 where items2.item1_id in (
      select id from items1 where items1.catid=categories.id
    )
  )

count2设置为引用该类别的items1items2中的行数:

update 
  categories 
set 
  count2=(
    select count(*) from items2 where items2.item1_id in (
      select id from items1 where items1.catid=categories.id
    ) + 
    select count(*) from items1 where items1.catid=categories.id
  )

答案 1 :(得分:0)

感谢MiMo的回复。最后,我能够自己做。

我做的是,

  1. 在items1表中添加了新的列item22_count,并在将新记录插入items2表时更新它。

  2. 现在我修改了第一个这样的查询来获取items2 count。

    SELECT 
        parent.id, sum(items2_count) as item2_count
    FROM 
        categories AS node ,
        categories AS parent,
        items1 AS items
    WHERE 
        node.nleft BETWEEN parent.nleft AND parent.nright 
        AND node.id = items.catid
        AND items.published = 1
    GROUP BY 
        parent.id
    ORDER BY 
        node.nleft;
    
  3. 我知道这会增加更新列的开销,但这是有充分理由的,我找不到其他方法。无论如何,谢谢你的回答。