查询中的棘手条件

时间:2019-05-05 15:03:24

标签: mysql

我正在做一个大学项目,对这些查询我很执迷。我们的数据库如下:

passengers(id,year_of_birth,name,surname)
flights_has_passengers(flights_id,passengers_id)
flights(id,routes_id,date)
routes(id,airlines_id)
airlines(id,name,alias,country,code,active)

我们被要求找到仅在名为“英国航空公司”的航空公司旅行的乘客。到目前为止,我的代码是:

SELECT passengers.name,passengers.surname 
FROM passengers
INNER JOIN flights_has_passengers on flights_has_passengers.passengers_id=passengers.id
INNER JOIN flights on flights_has_passengers.flights_id=flights.id
INNER JOIN routes on routes.id=flights.routes_id
INNER JOINairlines on routes.airlines_id=airlines.id
WHERE airlines.name='British Airways'
HAVING 
count(airlines.name)
ORDER BY passengers.name,passengers.surname

此代码可以找到乘坐过英国航空公司的乘客,而且还可以乘坐其他公司的乘客。所以我的问题是,我如何才能获得只乘坐过英国航空公司的乘客。

PS:对不起,我的英语不好。

1 个答案:

答案 0 :(得分:2)

尝试在HAVING子句中断言,除了英国航空公司以外,没有其他航空公司出现:

SELECT
    p.name,
    p.surname 
FROM passengers p
INNER JOIN flights_has_passengers fhp
    ON fhp.passengers_id = p.id
INNER JOIN flights f
    ON fhp.flights_id = f.id
INNER JOIN routes r
    ON r.id = f.routes_id
INNER JOIN airlines a
    ON r.airlines_id = a.id
GROUP BY
    p.name,
    p.surname 
HAVING
    COUNT(CASE WHEN a.name <> 'British Airways' THEN 1 END) = 0
ORDER BY
    p.name,
    p.surname;

请注意,我在查询中引入了表别名,使其更易于阅读。