因此,我正在努力编写一个查询,返回我所有的类别,而不管我应用了什么过滤器,但计数的变化取决于有多少返回食谱将在这个过滤器。
如果我不对这个查询应用任何过滤器,它会很好地工作。伯爵似乎是对的,但我一加上这样的话: 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的过滤器,不管他们所有。
任何帮助都将不胜感激。如果这个问题不是很清楚,请告诉我,我可以详细说明。
3条答案
按热度按时间bkkx9g8r1#
如果将条件移动到常规外部联接中,则不需要嵌套联接:
笔记:
使用
left
加入所有类别放
r.time_cook_minutes > 60
关于左连接条件。把它留在table上where
条款取消left
6uxekuva2#
我相信你想要:
笔记:
它使用
left join
代表所有连接。它由所有未聚合的列聚合。
它计算匹配的配方,而不是所有行。
配方上的条件移到
on
合同条款where
条款。twh00eeo3#
只需使用条件聚合,移动
WHERE
从句成句CASE
(或IF()
对于mysql)语句SUM()
1和0(即计数)。另外,请确保始终使用显式连接,这是sql中当前的行业实践。当派生表使用这种形式的联接时,外部查询在中使用与id匹配的隐式联接WHERE
条款。