我确实试着寻找这个答案,但没有运气:
它应该是基本的东西,但我不能使它工作...
我有三张桌子:
- FlightPerson
personID | 飞行ID |
---|---|
1 | 587 |
51 | 44 |
1 | 37 |
... | ... |
- 飞行
飞行ID | departure | arrive |
---|---|---|
37 | 1998-06-01 | 1998-06-03 |
587 | 2022-01-01 | 2022-01-02 |
44 | 2022-01-01 | 0000-00-00 |
... | ... | ... |
- 国家/地区
personID | 国家/地区ID |
---|---|
1 | 12 |
51 | 27 |
... | ... |
目标: Select 人员ID、航班ID、出发、到达、国家ID 其中,Country ID=12 and(上次航班是2000-01-01之前或最后一次航班是(2022-03-01之后,到达时间是0000-00-00))
谢谢你的帮忙!
SELECT t1.personID, 飞行.飞行ID, MAX(飞行.departure), 飞行.arrive, 国家/地区.国家/地区ID
FROM FlightPerson as t1
LEFT JOIN 飞行
ON t1.飞行ID = 飞行.飞行ID
LEFT JOIN 国家/地区
ON 国家/地区.personID = t1.personID
WHERE 国家/地区.国家/地区ID = 12 AND
飞行.departure < " 2000-01-01 " OR (飞行.departure > " 2022-03-01" AND 飞行.arrive= "0000-00-00 00:00:00")
GROUP BY personID
ORDER BY t1.personID ASC
EDIT个
根据Chris Schaller的回答,我重新构建了我的查询,它对我起作用了.
基本上(就像Chris在第二个Legacy查询中建议的那样),您首先需要找到最后一个航班ID,然后检索该航班的详细信息,并(使用WHERE子句)只获取出发和到达尊重您的条件的航班.
我把它贴在这里,以防对其他正在为同样问题而苦苦挣扎的人有用.)
SELECT personID
FROM (
SELECT DISTINCT t2.personID, 国家/地区.国家/地区ID
,(SELECT t1.飞行ID
FROM FlightPerson
LEFT JOIN 飞行 as t1
ON t1.飞行ID = FlightPerson.飞行ID
WHERE t2.personID = FlightPerson.personID
ORDER BY `t1`.` departure` DESC
LIMIT 1
)AS lastFlightID
FROM FlightPerson as t2
LEFT JOIN 国家/地区
ON 国家/地区.personID = t2.personID
) AS details
LEFT JOIN 飞行 AS b
ON details. lastFlightID = b.飞行ID
WHERE details.国家/地区ID = 12
AND ( b.departure < "2000-01-01"
OR
(b.departure > "2022-03-01" AND b.arrive = "0000-00-00 00:00:00")
)
附:对不起克里斯,我仍然需要使用双括号和(...或(...))
这样我感觉更有安全感.:D