我正在做一个大学项目,对这些查询我很执迷。我们的数据库如下:
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:对不起,我的英语不好。
答案 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;
请注意,我在查询中引入了表别名,使其更易于阅读。