我有一个嵌套集模型用于我的网站,子类别中的项目等等。除了一个我无法解决的问题之外,它的工作效果很好。
+---------+-----------------------------+
| item_id | item_name |
+---------+-----------------------------+
| 1 | Laptop |
| 2 | iPod Classic 80GB |
| 3 | iPod Classic 160GB |
+---------+-----------------------------+
+---------+-------------+
| item_id | category_id |
+---------+-------------+
| 1 | 4 |
| 2 | 2 |
| 3 | 2 |
+---------+-------------+
+-------------+--------------------+-----+-----+
| category_id | name | lft | rgt |
+-------------+--------------------+-----+-----+
| 1 | iPod | 1 | 6 |
| 2 | Classic | 2 | 3 |
| 3 | Nano | 4 | 5 |
| 4 | Computers | 7 | 8 |
+-------------+--------------------+-----+-----+
使用以下查询:
SELECT parent.name, COUNT(product.item_id)
FROM Category AS node, Category AS parent, Item_Category AS product
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.category_id = product.category_id
GROUP BY parent.name
ORDER BY node.lft;
提供以下输出:
+-----------------+------------------------+
| name | COUNT(product.item_id) |
+-----------------+------------------------+
| iPod | 2 |
| Classic | 2 |
| Computers | 1 |
+-----------------+------------------------+
换句话说,所有没有产品的字段都不会显示。现在问题,我想用COUNT()result = 0显示它们。我的查询将如何实现这一点? :)
答案 0 :(得分:3)
听起来像是LEFT OUTER JOIN的任务,就像这样:
SELECT parent.name, COUNT(product.item_id),
(select count(*) from Category parent2
where parent.lft > parent2.lft
and parent.rgt < parent2.rgt) as depth
FROM Category parent
LEFT OUTER JOIN Category node
ON node.lft BETWEEN parent.lft AND parent.rgt
LEFT OUTER JOIN Item_Category product
ON node.category_id = product.category_id
GROUP BY parent.name
ORDER by node.lft
因此,您可以确保显示所有类别。请注意,我不是百分百确定。
编辑:添加了深度的子选择,试一试。
编辑:删除逗号