MySQL查询按airline_id分组后monday全为0的航司实现方案
表结构与需求说明
字段定义
-- 航司表 airline: airline_id; airlinename -- 航班排班表 flightschedule: flight_id; monday; airline_id
monday字段取值规则:1=该航班周一执飞,0=该航班周一不执飞。
需求目标
查询所有周一完全没有航班执飞的航司,即同一airline_id对应的所有monday字段值均为0,包含从未排过任何航班的航司。
可行实现方案
方案1:LEFT JOIN + 聚合过滤(适配你给出的查询框架调整)
SELECT a.airlinename FROM airline a LEFT JOIN flightschedule f ON a.airline_id = f.airline_id GROUP BY a.airline_id, a.airlinename HAVING MAX(IFNULL(f.monday, 0)) = 0;
逻辑说明:
- 用LEFT JOIN保留所有航司记录,没有排班的航司对应的排班表字段会返回NULL,用
IFNULL转为0 - 聚合后取每个航司所有排班的
monday最大值,最大值为0就说明该航司没有任何周一执飞的航班,完全符合要求
如果你坚持使用原有RIGHT JOIN的写法,也可以调整为以下代码,注意该写法无法覆盖没有任何排班记录的航司:
SELECT airlinename FROM airline RIGHT JOIN flightschedule ON airline.airline_id = flightschedule.airline_id GROUP BY airline.airline_id, airlinename HAVING MAX(monday) = 0;
方案2:NOT EXISTS子查询(逻辑更直观,性能更优)
SELECT a.airlinename FROM airline a WHERE NOT EXISTS ( SELECT 1 FROM flightschedule f WHERE f.airline_id = a.airline_id AND f.monday = 1 );
逻辑说明:只要该航司不存在任何一条周一执飞的排班记录,就会被筛选出来,默认包含无排班的航司。
内容的提问来源于stack exchange,提问作者Lucas Winkler
相关产品推荐
相关产品推荐

