如何使用mysql查询检索顶级类别中的项目数并包括直接子类别中的项目

时间:2010-09-10 09:15:34

标签: mysql

我试过..

SELECT  c.* , (
    SELECT COUNT( * )
    FROM item t
    WHERE t.cat_id = c.cat_id
    )ct_items, (

    SELECT COUNT( * )
    FROM item t
    INNER JOIN cat c3 ON t.cat_id = c3.cat_id
    AND c3.cat_id = c.parent_id
    ) ct_sub
FROM cat c
WHERE parent_id = '0'
ORDER BY name

但在'on子句'中获得了未知列'c.parent_id'。任何想法为什么我得到这个或另一种方式来实现这个使用mysql查询?我可以使用多个查询和使用php等来训练数字。

由于

1 个答案:

答案 0 :(得分:1)

您不一定要在一个查询中执行所有操作;有时候尝试将查询粘合在一起会导致性能下降(特别是涉及相关子查询时)。两个查询都可以;当你最终为你遇到问题的每一行调用一个新查询时。

所以你可以得到类别项目:

SELECT c0.*, COUNT(i0.id) AS cat_nitems
FROM cat AS c0
LEFT JOIN item AS i0 ON i0.cat_id=c0.cat_id
WHERE c0.parent_id= '0'
GROUP BY c0.cat_id
ORDER BY c0.name

然后使用父子自连接分别获取子类别项:

SELECT c0.*, COUNT(i1.id) AS subcats_nitems
FROM cat AS c0
LEFT JOIN cat AS c1 ON c1.parent_id=c0.cat_id
LEFT JOIN item AS i1 ON item.cat_id=c1.cat_id
WHERE c0.parent_id= '0'
GROUP BY c0.cat_id
ORDER BY c0.name

是的,您可以将它们加入到一个查询中:

SELECT c0.*, COUNT(DISTINCT i0.id) AS cat_nitems, COUNT(DISTINCT i1.id) AS subcats_nitems
FROM cat AS c0
LEFT JOIN cat AS c1 ON c1.parent_id=c0.cat_id
LEFT JOIN item AS i0 ON item.cat_id=c0.cat_id
LEFT JOIN item AS i1 ON item.cat_id=c1.cat_id
WHERE c0.parent_id= '0'
GROUP BY c0.cat_id
ORDER BY c0.name

我怀疑较大的连接和DISTINCT处理可能会降低效率。但是我想在一个小型数据库上你不会注意到。

无论哪种方式,这只适用于双深嵌套。如果您通常需要子子类或任意深度树,则应考虑更好地建模树的模式,例如嵌套集。