MariaDB查询无主菜(recipe_course=18)日期返回空结果,求问题排查
问题分析与解决方案
你的问题出在SQL逻辑的矛盾上——让我一步步拆解给你看:
原SQL的核心错误
你写的SQL先用**内连接(Join)**关联了meals和recipes,同时通过Where rrr.recipe_course = 18筛选出所有包含course=18的餐食记录。这一步之后,结果集里只剩下那些关联到course=18的meal记录了,再分组后Count(recipe_course)至少是1,Having Count(...) = 0的条件永远不可能满足,自然返回空结果。
正确的查询思路
我们要找的是没有任何餐食属于course=18的日期,可以用两种常见的方法实现:
方法1:使用NOT EXISTS(推荐,逻辑清晰)
这种方法直接检查每个日期的餐食中,是否不存在关联到course=18的菜谱:
SELECT DISTINCT meal_date FROM meals mls WHERE NOT EXISTS ( SELECT 1 FROM recipes rrr WHERE rrr.recipe_id = mls.meal_recipe AND rrr.recipe_course = 18 )
- 逻辑:遍历
meals里的每条记录,只要该记录关联的菜谱没有course=18的,就保留对应的日期;用DISTINCT是为了去重,避免同一个日期出现多次。
方法2:左连接+分组统计
把meals和仅course=18的菜谱左连接,然后统计每个日期下匹配到的course=18的数量为0的日期:
SELECT mls.meal_date FROM meals mls LEFT JOIN recipes rrr ON mls.meal_recipe = rrr.recipe_id AND rrr.recipe_course = 18 -- 注意:把course条件放在ON里,不是WHERE里 GROUP BY mls.meal_date HAVING COUNT(rrr.recipe_id) = 0
- 逻辑:左连接会保留所有
meals的记录,没有匹配到course=18的菜谱时,rrr.recipe_id会是NULL;分组后统计该日期下非NULL的recipe_id数量,为0就说明这个日期没有任何餐食属于course=18。
关键提醒
别把rrr.recipe_course = 18放在WHERE里——如果放在WHERE里,左连接会被转换成内连接,和你原来的错误逻辑一样,只会保留有course=18的记录。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

