Mysql 在自联接查询中使用COUNT

Mysql 在自联接查询中使用COUNT,mysql,Mysql,我有一个填充双选择列表的查询。该查询通过自联接从同一个表中检索主类别和子类别。基本上,它使用id和父id连接自身以获取每个类别中的子类别。我尝试使用COUNT来获取子类别的数量,以便将该数量添加到第一个列表的输出中。我没有编写查询,我只是想对它进行重构以计算每个main中的sub SELECT root.name AS root_name, root.link AS root_link, root.RETAIL AS root_RETAIL, root.W

我有一个填充双选择列表的查询。该查询通过自联接从同一个表中检索主类别和子类别。基本上,它使用id和父id连接自身以获取每个类别中的子类别。我尝试使用COUNT来获取子类别的数量,以便将该数量添加到第一个列表的输出中。我没有编写查询,我只是想对它进行重构以计算每个main中的sub

SELECT 
    root.name AS root_name, 
    root.link AS root_link, 
    root.RETAIL AS root_RETAIL, 
    root.WHOLESALE AS root_WHOLESALE,
    root.linkto AS root_linkto, 
    root.keywords AS root_keywords, 
    root.description AS root_description, 
    root.id AS root_id,
    down1.name AS down1_name,
    down1.linkto AS down1_linkto, 
    down1.link AS down1_link, 
    down1.keywords AS down1_keywords,
    down1.description AS down1_description, 
    down1.id AS down1_id, 
    down1.parentid AS down1_parentid, 
    down1.RETAIL AS down1_RETAIL, 
    down1.WHOLESALE AS down1_WHOLESALE
FROM categories AS root
        LEFT OUTER JOIN categories AS down1 ON down1.parentid = root.id
WHERE root.parentid = 0
ORDER BY root_name, down1_name 

这将返回填充两个列表的所有内容。我尝试将
down1\u name
down1\u id
包围在
COUNT
中,但它计算所有内容,而不是每个main中的sub数。我不确定是否要使用另一个自联接来执行此操作,或者使用嵌套的
选择
计数
。如有任何见解,将不胜感激。Tks.

如果你尝试这样的东西

select count(cs.down1_name) as mycount from
    (
    SELECT root.name AS root_name, 
    root.link AS root_link, 
    root.RETAIL AS root_RETAIL, 
    root.WHOLESALE AS root_WHOLESALE,
    root.linkto AS root_linkto, 
    root.keywords AS root_keywords, 
    root.description AS root_description, 
    root.id AS root_id,
    down1.name AS down1_name,
    down1.linkto AS down1_linkto, 
    down1.link AS down1_link, 
    down1.keywords AS down1_keywords,
    down1.description AS down1_description, 
    down1.id AS down1_id, 
    down1.parentid AS down1_parentid, 
    down1.RETAIL AS down1_RETAIL, 
    down1.WHOLESALE AS down1_WHOLESALE
    FROM categories AS root
    LEFT OUTER JOIN categories AS down1 ON down1.parentid = root.id
    WHERE root.parentid = 0
    ORDER BY root_name, down1_name ) as cs
    group by cs.down1_name
-----------------更新-------------------------------------

像这样的

SELECT cat_a.name, 
   cat_a.link, 
   cat_a.RETAIL, 
   cat_a.WHOLESALE,
   cat_a.linkto, 
   cat_a.keywords, 
   cat_a.description, 
   cat_a.id,
   cat_b.name cat_b_name,
   cat_b.linkto cat_b_linkto, 
   cat_b.link cat_b_link, 
   cat_b.keywords cat_b_keywords,
   cat_b.description cat_b_description, 
   cat_b.id cat_b_id, 
   cat_b.parentid cat_b_parentid, 
   cat_b.RETAIL cat_b_RETAIL, 
   cat_b.WHOLESALE cat_b_WHOLESALE,
   (SELECT COUNT(1) FROM categories 
     WHERE parentid = cat_a.id) as cat_b_count
FROM categories cat_a LEFT OUTER JOIN categories cat_b 
ON (cat_b.parentid = cat_a.id)
WHERE cat_a.parentid = 0

这是小提琴:

如果你尝试这样的东西

select count(cs.down1_name) as mycount from
    (
    SELECT root.name AS root_name, 
    root.link AS root_link, 
    root.RETAIL AS root_RETAIL, 
    root.WHOLESALE AS root_WHOLESALE,
    root.linkto AS root_linkto, 
    root.keywords AS root_keywords, 
    root.description AS root_description, 
    root.id AS root_id,
    down1.name AS down1_name,
    down1.linkto AS down1_linkto, 
    down1.link AS down1_link, 
    down1.keywords AS down1_keywords,
    down1.description AS down1_description, 
    down1.id AS down1_id, 
    down1.parentid AS down1_parentid, 
    down1.RETAIL AS down1_RETAIL, 
    down1.WHOLESALE AS down1_WHOLESALE
    FROM categories AS root
    LEFT OUTER JOIN categories AS down1 ON down1.parentid = root.id
    WHERE root.parentid = 0
    ORDER BY root_name, down1_name ) as cs
    group by cs.down1_name
-----------------更新-------------------------------------

像这样的

SELECT cat_a.name, 
   cat_a.link, 
   cat_a.RETAIL, 
   cat_a.WHOLESALE,
   cat_a.linkto, 
   cat_a.keywords, 
   cat_a.description, 
   cat_a.id,
   cat_b.name cat_b_name,
   cat_b.linkto cat_b_linkto, 
   cat_b.link cat_b_link, 
   cat_b.keywords cat_b_keywords,
   cat_b.description cat_b_description, 
   cat_b.id cat_b_id, 
   cat_b.parentid cat_b_parentid, 
   cat_b.RETAIL cat_b_RETAIL, 
   cat_b.WHOLESALE cat_b_WHOLESALE,
   (SELECT COUNT(1) FROM categories 
     WHERE parentid = cat_a.id) as cat_b_count
FROM categories cat_a LEFT OUTER JOIN categories cat_b 
ON (cat_b.parentid = cat_a.id)
WHERE cat_a.parentid = 0
这里是关键:

尝试使用子查询

SELECT r.name AS r_name, 
       r.link AS r_link, 
       r.RETAIL AS r_RETAIL, 
       r.WHOLESALE AS r_WHOLESALE,
       r.linkto AS r_linkto, 
       r.keywords AS r_keywords, 
       r.description AS r_description, 
       r.id AS r_id,
       d.name AS d_name,
       d.linkto AS d_linkto, 
       d.link AS d_link, 
       d.keywords AS d_keywords,
       d.description AS d_description, 
       d.id AS d_id, 
       d.parentid AS d_parentid, 
       d.RETAIL AS d_RETAIL, 
       d.WHOLESALE AS d_WHOLESALE,
       (SELECT COUNT(*) FROM categories 
         WHERE parentid = r.id) d_count
  FROM categories AS r LEFT OUTER JOIN categories AS d 
    ON d.parentid = r.id
 WHERE r.parentid = 0
 ORDER BY r_name, d_name

尝试使用子查询

SELECT r.name AS r_name, 
       r.link AS r_link, 
       r.RETAIL AS r_RETAIL, 
       r.WHOLESALE AS r_WHOLESALE,
       r.linkto AS r_linkto, 
       r.keywords AS r_keywords, 
       r.description AS r_description, 
       r.id AS r_id,
       d.name AS d_name,
       d.linkto AS d_linkto, 
       d.link AS d_link, 
       d.keywords AS d_keywords,
       d.description AS d_description, 
       d.id AS d_id, 
       d.parentid AS d_parentid, 
       d.RETAIL AS d_RETAIL, 
       d.WHOLESALE AS d_WHOLESALE,
       (SELECT COUNT(*) FROM categories 
         WHERE parentid = r.id) d_count
  FROM categories AS r LEFT OUTER JOIN categories AS d 
    ON d.parentid = r.id
 WHERE r.parentid = 0
 ORDER BY r_name, d_name

通过查询,这可能会更容易。类似这样(我们假设主查询名为q1)


选择r\u id maincat
,计数(*)子类别
从第一季度开始
其中d_name不为空
按r\u id分组
选择q1*
,子类别
从第一季度到第二季度
其中r_id=maincat

然后使用q3而不是q1来填充列表。

这可能更容易查询查询。类似这样(我们假设主查询名为q1)


选择r\u id maincat
,计数(*)子类别
从第一季度开始
其中d_name不为空
按r\u id分组
选择q1*
,子类别
从第一季度到第二季度
其中r_id=maincat


然后用q3而不是q1填充列表。

我想你误解了这个问题。他还需要返回其他列,而不仅仅是一个
计数
。他可以以单独的方式执行这两个查询,或者调整这一个以填充他的查询。上面的查询返回一个计数,而他正在查找每个父项的计数,如@peterm的示例中所示。一个计数……您是否通过cs.down1\u name看到这个组,在问题的结尾??不,我完全没有注意到。我还没有测试过它,但我非常确定按
cs.down1\u name
分组仍然不会返回正确的计数。。。(见原问题)。你测试过了吗?我想你误解了这个问题。他还需要返回其他列,而不仅仅是一个
计数
。他可以以单独的方式执行这两个查询,或者调整这一个以填充他的查询。上面的查询返回一个计数,而他正在查找每个父项的计数,如@peterm的示例中所示。一个计数……您是否通过cs.down1\u name看到这个组,在问题的结尾??不,我完全没有注意到。我还没有测试过它,但我非常确定按
cs.down1\u name
分组仍然不会返回正确的计数。。。(见原问题)。您测试过吗?这将返回一个语法错误,试图对其进行排序。我试过类似的东西,结果都一样。Tks@史蒂夫:对不起,这只是
d.wholesal后面省略了一个逗号,作为d\u wholesal,
。请参阅更新的答案,啊,我放了一个,但也用作d_计数的前面。很好!非常感谢!此外,在这篇文章之前,我自己尝试过这一点,我在我的别名中使用了嵌套SELECT,其中您的别名是d_count。没有意识到我不需要它。@Steve非常欢迎:)
因为
是可选的。为了保证查询的一致性,您可以在d_count之前使用它。这将返回一个语法错误,并尝试对其进行排序。我试过类似的东西,结果都一样。Tks@史蒂夫:对不起,这只是
d.wholesal后面省略了一个逗号,作为d\u wholesal,
。请参阅更新的答案,啊,我放了一个,但也用作d_计数的前面。很好!非常感谢!此外,在这篇文章之前,我自己尝试过这一点,我在我的别名中使用了嵌套SELECT,其中您的别名是d_count。没有意识到我不需要它。@Steve非常欢迎:)
因为
是可选的。为了在查询中保持一致性,您可以在d_count之前使用它。我考虑在CF代码中使用此方法,因为它很好且经过封装,如果我可以获得正确的计数,只需为其创建一个变量并以这种方式输出即可。还没什么,但我在查询原始查询。tks!我考虑在CF代码中使用这个方法,因为它很好,而且是封装的,如果我能得到正确的计数,只需为它创建一个变量并以这种方式输出即可。还没什么,但我在查询原始查询。tks!