表...
contracts
---------
id
contract_locations
------------------
id
contract_id # A contract can have many contract locations.
name # E.g., "Front office", "Legal", "Contracts admin", etc.
arrival_date
用户认为最后arrival_date
的位置是给定合约的“当前位置”。
他们希望能够找到当前位置name
等于(例如)“前台”或“法律”的所有合约。
如何编写MySQL 5.1查询来执行此操作?
答案 0 :(得分:1)
这是一种方法:
select c.id
from (select c.*,
(select name
from contract_locations cl
where cl.contract_id = c.id
order by arrival_date desc
limit 1
) CurrentLocation
from contracts c
) c
where CurrentLocation = 'Front Office'
这使用相关子查询来获取当前位置。通过在Contract_Locations(contract_id, arrival_date)
上建立索引,可以大大提高性能。
这是另一种可能不太明显的方法。我们的想法是查看最近的日期是否是给定位置的最近日期。这使用having
子句:
select contract_id
from contract_locations cl
group by contract_id
having max(arrival_date) = max(case when name = 'Front Office' then arrival_date end)
having
子句仅在'Front Office'
(或其他)是最近日期时才为真。
答案 1 :(得分:1)
SELECT contract_id
FROM contract_locations l
JOIN (SELECT contract_id, MAX(arrival_date) curdate
FROM contract_locations
GROUP BY contract_id) m
ON l.contract_id = m.contract_id and l.arrival_date = m.curdate
WHERE l.name = 'Front Office'