所以有3个表
1 passanger detail
2预订
3次飞行
通勤
+----+------+
| id | name |
+----+------+
| 1 | A |
| 2 | B |
| 3 | C |
+----+------+
预订
+----+-------+
| id |flight |
+----+-------+
| 1 | 101 |
| 1 | 102 |
| 1 | 103 |
| 2 | 101 |
| 3 | 104 |
| 2 | 105 |
+----+-------+
飞行
+--------+------+
| flight | late |
+--------+------+
| 101 | 80 |
| 102 | 80 |
| 103 | 80 |
| 104 | 10 |
| 105 | 10 |
+--------+------+
表1包含传递者ID和姓名
表2包含passanger id及其航班ID
表3包含航班ID和延迟多少分钟
现在我想找出所有航班延迟50分钟或更长时间的乘客姓名
所以输出为A
因为101 102和103晚80分钟
不是B
,因为101晚了80分钟,但105晚了10分钟(并非所有b的航班晚到50分)
所以我的方法是
select name from passanger,booking where passanger.id=booking.id and booking.flight = ALL (select flight.flight from flight where flight.late>50)
无法获得所需的输出。
答案 0 :(得分:1)
您可以按名称进行分组,并检查乘客的所有航班是否都迟到having
条件。
select p.name
from passanger p
join booking b on p.id=b.id
join flight f on f.flight = b.flight
group by p.name
having count(*) = count(case when f.late>50 then f.flight end)
答案 1 :(得分:0)
试试这个:
select name from passanger, booking
where passanger.id = booking.id
and booking.flight in (select flight.flight from flight
where flight.late > 50)
或
select name from passanger, booking, flight
where passanger.id = booking.id and booking.flight = flight.flight and flight.late > 50
这将导致姓名3次,b名称一次,但如果您只想在结果中获得a和b的一个实例,则可以使用select distinct name
。< / p>
答案 2 :(得分:0)
select ps.name from passanger ps left join booking bk on (ps.id = bk.id) left join flight fl on (fl.flight = bk.flight) where late >50