我试过了 ..

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等来锻炼数字。

谢谢

最佳答案

您不必一定要在一个查询中做任何事情;有时尝试将查询粘合在一起会导致性能下降(尤其是在涉及相关子查询时)。两个查询就可以了;当您最终对遇到的每行调用一个新查询时。

因此,您可以获得类别项:

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处理可能会使效率降低。但是,我想您不会注意到一个小的数据库。

无论哪种方式,这仅适用于两层深度的嵌套。如果通常需要子子类别或任意深度的树,则应考虑一种更适合对树进行建模的架构,例如嵌套集。

关于mysql - 如何使用mysql查询检索顶级类别中的项目计数,并包括直接子类别中的项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3683438/

10-14 13:36
查看更多