我有以下结构的表格。
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连接,因此非常感谢任何帮助。
答案 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
有关在SQL中管理分层数据的更多建议,请参阅here。
请注意,我的查询仅计算类别的直接子节点,而不计算后代叶节点。使用该页面中的术语,您的模式是 Adjacency-List Model ,并且很难在SQL中处理多个级别 - 它没有循环或递归。如果转换为嵌套集模型,他将展示如何使用简单查询计算所有终端节点。