返回外部查询的所有结果并获取附加项的计数

5rgfhyps  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(214)

因此,我正在努力编写一个查询,返回我所有的类别,而不管我应用了什么过滤器,但计数的变化取决于有多少返回食谱将在这个过滤器。
如果我不对这个查询应用任何过滤器,它会很好地工作。伯爵似乎是对的,但我一加上这样的话: where c.parent_id is not null and r.time_cook_minutes > 60 我过滤掉了大部分类别,而不是仅仅得到一个零计数。
下面是我提出的一个查询示例,它的工作方式与我希望的不同:

select t.id, t.name, t.parent_id, a.cntr from categories as t,
   (select c.id, count(*) as cntr from categories as c 
   inner join recipe_categories as rc on rc.category_id = c.id
   inner join recipes as r on r.id = rc.recipe_id 
   where c.parent_id is not null and r.time_cook_minutes > 60
   group by c.id) as a
where a.id = t.id
group by t.id

所以现在,正如你所想象的,它只返回存在于这个过滤器子集中的配方计数。。。我想得到的是,如果他们没有任何配方下的过滤器计数为0的过滤器,不管他们所有。
任何帮助都将不胜感激。如果这个问题不是很清楚,请告诉我,我可以详细说明。

bkkx9g8r

bkkx9g8r1#

如果将条件移动到常规外部联接中,则不需要嵌套联接:

select t.id, t.name, t.parent_id, count(r.id)
from categories as t
left join recipe_categories as rc on rc.category_id = c.id
left join recipes as r on r.id = rc.recipe_id
   and r.time_cook_minutes > 60
where c.parent_id is not null
group by 1, 2, 3

笔记:
使用 left 加入所有类别
r.time_cook_minutes > 60 关于左连接条件。把它留在table上 where 条款取消 left

6uxekuva

6uxekuva2#

我相信你想要:

select c.id, c.name, c.parent_id, count(r.id)
from categories c left join
     recipe_categories rc
     on rc.category_id = c.id left join
     recipes r
     on r.id = rc.recipe_id and r.time_cook_minutes > 60
where c.parent_id is not null and 
group by c.id, c.name, c.parent_id;

笔记:
它使用 left join 代表所有连接。
它由所有未聚合的列聚合。
它计算匹配的配方,而不是所有行。
配方上的条件移到 on 合同条款 where 条款。

twh00eeo

twh00eeo3#

只需使用条件聚合,移动 WHERE 从句成句 CASE (或 IF() 对于mysql)语句 SUM() 1和0(即计数)。另外,请确保始终使用显式连接,这是sql中当前的行业实践。当派生表使用这种形式的联接时,外部查询在中使用与id匹配的隐式联接 WHERE 条款。

select t.id, t.name, t.parent_id, a.cntr 
from categories as t
inner join
   (select c.id, sum(case when c.parent_id is not null and r.time_cook_minutes > 60
                          then 1 
                          else 0
                     end) as cntr 
    from categories as c 
    inner join recipe_categories as rc on rc.category_id = c.id
    inner join recipes as r on r.id = rc.recipe_id 
    group by c.id) as a
on a.id = t.id
group by t.id

相关问题