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

MySQL单查询实现三类食物食用量分栏统计,求正确SQL语句

修正后的MySQL查询语句

我来帮你搞定这条SQL~ 首先先基于常规的表结构逻辑做假设(如果你的字段名和我假设的有差异,直接替换对应字段就行):

  • animal_tbl:存储动物基础信息,包含animal_num(动物编号,主键)、animal_fname(名)、animal_lname(姓)
  • animal_ate_tbl:记录动物进食行为,包含animal_num(关联动物表的外键)、food_id(关联食物类型表的外键)
  • food_type_tbl:存储食物类型,包含food_id(主键)、food_name(食物名称,比如"香蕉"、"苹果"、"chico")

下面是能实现你需求的正确SQL:

SELECT
  a.animal_num,
  CONCAT(a.animal_fname, ' ', a.animal_lname) AS full_name,
  COUNT(CASE WHEN f.food_name = '香蕉' THEN 1 END) AS banana_eat_count,
  COUNT(CASE WHEN f.food_name = '苹果' THEN 1 END) AS apple_eat_count,
  COUNT(CASE WHEN f.food_name = 'chico' THEN 1 END) AS chico_eat_count
FROM animal_tbl a
LEFT JOIN animal_ate_tbl aa ON a.animal_num = aa.animal_num
LEFT JOIN food_type_tbl f ON aa.food_id = f.food_id
GROUP BY a.animal_num, full_name;

几个关键细节说明:

  • 用LEFT JOIN而非INNER JOIN:这样就算某个动物从没吃过这三种食物里的任何一种,也会被统计进来,对应的次数会显示为0,不会被过滤掉
  • 条件聚合COUNT(CASE ...):通过CASE语句筛选出对应食物的记录,再用COUNT统计次数,实现把每种食物的食用次数拆成单独的列展示
  • GROUP BY按动物编号+全名分组:确保每个动物只输出一行统计结果,不会出现重复行

如果你的食物名称直接存在animal_ate_tbl里(不需要关联food_type_tbl),可以用简化版:

SELECT
  a.animal_num,
  CONCAT(a.animal_fname, ' ', a.animal_lname) AS full_name,
  COUNT(CASE WHEN aa.food_name = '香蕉' THEN 1 END) AS banana_eat_count,
  COUNT(CASE WHEN aa.food_name = '苹果' THEN 1 END) AS apple_eat_count,
  COUNT(CASE WHEN aa.food_name = 'chico' THEN 1 END) AS chico_eat_count
FROM animal_tbl a
LEFT JOIN animal_ate_tbl aa ON a.animal_num = aa.animal_num
GROUP BY a.animal_num, full_name;

你之前的查询出错大概率是这几个原因:

  • 用了INNER JOIN导致没进食记录的动物被过滤
  • 没用到条件聚合,反而按食物分组,导致每个动物对应多行结果
  • 拼接全名时没处理空值(如果fname或lname可能为空,换成CONCAT_WS(' ', a.animal_fname, a.animal_lname)会更稳妥,它会自动忽略NULL值)

内容的提问来源于stack exchange,提问作者picolo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:41:28