You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:20:42