MySQL - WHERE 按 ID 分组的列中的每个值都是 0

MySQL - WHERE every Value in Column grouped by ID is 0

给定包含列的表:

airline:
airline_id; airlinename 

flightschedule:
flight_id; monday; airline_id

注意:“星期一”可以是 1 或 0 --> 1 表示该航班在星期一飞行,0 表示它不在星期一飞行。

现在我需要显示所有周一不飞的航空公司(每个 airline_id 的所有周一值都等于 0)。

我的基本输出是这样的:

SELECT airlinename FROM airline

RIGHT JOIN flightschedule ON airline.airline_id = flightschedule.airline_id

WHERE (...) GROUP BY airlinename;

但现在我需要过滤结果以显示从不在星期一飞行的航空公司(每个 airline_id 的星期一的所有值都等于 0)。我找不到解决方案。

有人知道我可以尝试什么吗?

您可以尝试在 modanly 飞行的航空公司的子查询上使用左连接并检查不匹配值

SELECT DISTINCT airlinename 
FROM airline
LEFT JOIN
    (SELECT distinct airline_id
     FROM airline
     JOIN flightschedule ON airline.airline_id = flightschedule.airline_id 
                         AND monday = 0) a ON a.airline_id = airline.airline_id 
WHERE a.airline_id IS NULL

忽略标题并查看问题,因为这让我陷入了 XY 问题...

我需要显示所有周一不飞的航空公司(每个 airline_id 的所有周一值都等于 0)。

似乎是 Not Exists:

的一个很好的用途

下面的SQL简单的说:找到某家航空公司周一有航班的任何事件,并将其从所有航空公司的结果列表中排除。因此 return 仅对那些星期一不飞的航空公司...永远...对于任何航班时刻表...

SELECT airlinename 
FROM airline AL
WHERE Not Exits (SELECT 1 
                 FROM flightschedule FS
                 WHERE AL.airline_id = FS.airline_id
                   AND Monday=1)

子查询:return周一发生的所有航班。

外部查询: return 子查询中不存在的所有航空公司。 (因此不是星期一)

not exists 有提前逃逸的好处,因为一旦它发现一个事件,优化器就可以停止查找并转到列表中的下一个项目,而不必检查每个航班时刻表。

细分:

  • WHERE Not Exits -- return 只有 objects 没有基于子查询中相关关系的关系。
  • SELECT 1 -- 你必须 return 一些东西,不管这个值是多少,它都会被丢弃,并且永远不会通过使用系统不需要的硬编码常量来使用做任何额外的工作来查找该值
  • FROM flightschdule FS -- 我们在子查询中为 table 添加了别名,因此我们可以在它和外部
  • 之间创建关联
  • WHERE AL.airline_id = FS.airline_id -- 这将 inner/outer 查询绑定在一起
  • AND Monday=1) -- return 仅在周一飞行的航班

或者:

SELECT distinct airlinename 
FROM airline
LEFT JOIN flightschedule 
   ON airline.airline_id = flightschedule.airline_id
  AND monday=1
WHERE flightschedule.airline_id is null;
  • QUERY:Return所有航空公司和周一有航班的航空公司。
  • 请注意,星期一的过滤器包含在连接本身中;不是 where 子句的一部分,因此只有航班时刻表发生在星期一的记录才会被 returned。在加入。如果我们在 where 子句中这样做,我们可能会得到 non-monday 航班 returned。所以对连接的限制是必要的。
  • WHERE:排除周一有航班的航空公司。