根据父节点的子节点数获取父节点的计数

时间:2013-10-24 06:01:43

标签: mysql sql

我有以下结构的表格。

AD_TABLE -
              ID|NAME|CAT_ID|TYPE
               1| car | C0101|Sale
               2|bike | C0201|Want
CAT_TABLE -
              ID   |NAME          |PARENT|LEVEL
              C0100|Vehicle       |C0100 |    0
              C0101|Car           |C0100 |    1
              C0200|Bike/Scooters |C0100 |    1
              C0201|Bike          |C0200 |    2
              C0202|Scooter       |C0200 |    2

我需要获得每个类别的广告计数。我正在使用以下查询

SELECT     `CAT_TABLE`.`ID`,`CAT_TABLE`.`NAME`,`CAT_TABLE`.`LEVEL`,`CAT_TABLE`.`PARENT`,      COUNT(`AD_TABLE`.`ID`) 
    FROM       `CAT_TABLE` 
    LEFT JOIN  `AD_TABLE` 
    ON         `AD_TABLE`.`CAT_ID`=`CAT_TABLE`.`ID`
    AND        `AD_TABLE`.`TYPE`='0'
    WHERE      (`CAT_TABLE`.`ID`='C0100' OR `CAT_TABLE`.`PARENT`='C0100')
    GROUP BY   `CAT_TABLE`.`ID`

这使得主要类别的车辆,自行车/踏板车的数量为0.我需要这些类别来获得相应子类别的计数。例如:车辆应该是汽车+自行车/踏板车的总数,自行车/踏板车的数量应该是自行车+踏板车的总数。我仍然在研究高级SQL连接,因此非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

使用UNION将AD_TABLE中的项目与CAT_TABLE

中的子类别相结合
SELECT c.ID, c.NAME, c.LEVEL, c.PARENT, COUNT(a.ID)
FROM CAT_TABLE c
LEFT JOIN (SELECT ID, CAT_ID
           FROM AD_TABLE
           WHERE TYPE = '0'
           UNION ALL
           SELECT ID, PARENT
           FROM CAT_TABLE
           WHERE LEVEL != 0) a
ON a.CAT_ID = c.ID
GROUP BY c.ID

SQLFIDDLE

有关在SQL中管理分层数据的更多建议,请参阅here

请注意,我的查询仅计算类别的直接子节点,而不计算后代叶节点。使用该页面中的术语,您的模式是 Adjacency-List Model ,并且很难在SQL中处理多个级别 - 它没有循环或递归。如果转换为嵌套集模型,他将展示如何使用简单查询计算所有终端节点。