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
相关产品推荐
相关产品推荐

