代码之家  ›  专栏  ›  技术社区  ›  TigerTiger

如何使用MySQL查询检索顶级类别中的项数,以及直接子类别中的项数

  •  0
  • TigerTiger  · 技术社区  · 16 年前

    我试过了。

    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”。我为什么要用MySQLquery来实现这个或其他方法?不过,我可以使用多个查询和php等来锻炼这些数字。

    谢谢

    1 回复  |  直到 16 年前
        1
  •  1
  •   bobince    16 年前

    您不必在一个查询中做任何事情;有时尝试将查询粘合在一起会导致性能下降(尤其是涉及相关子查询时)。两个查询是可以的;当您为每一行调用一个新的查询时,就会出现问题。

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

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

    不管怎样,这只对两个深的巢穴有效。如果您一般需要子类别或任意深度的树,您应该考虑一个更适合于树建模的模式,例如嵌套集。