我有2个表: contracts_main_list 和 contracts_detail 。 在contracts_main_list中,我有列:
user_id
contract_id
并在contract_detail中:
contract_id
other columns with data
我需要从表contracts_main_list WHERE user_id = some number
中选择所有行。
从这些行我需要获取合同号列表(来自列contract_id
),并根据它们从列表中选择与每个合同号对应的行。如下所示:
WHERE contracts_detail.contract_id = contracts_main_list.contract_id
contract_ids可能是唯一的,但是如果出现某种错误,并且在任一表中会有更多行具有相同的contract_id,我只需要选择一行(所以可能使用DISTINCT)和选择最新记录(两个表都有一个列id作为主键)
此外,如果contract_detail中的行没有与第一个表contracts_main_list
的contract_id的contract_id匹配,那么它应该跳过该行。但我想条件是:
WHERE contracts_detail.contract_id = contracts_main_list.contract_id
已经涵盖了它。
我希望我说得够清楚。我在现实生活中想要做的是显示包含属于用户的所有相关数据的合同清单。
总而言之,我需要查找属于用户的所有合同,并选择包含每个合同详细信息的行,最后从contracts_detail表中获取数据。
答案 0 :(得分:1)
以下是您正在寻找的结果:
SELECT CD.*
FROM (SELECT C2.contract_id
,MAX(C2.id) AS last_main_list_id
,MAX(CD2.id) AS last_contracts_detail_id
FROM contracts_main_list C2
INNER JOIN contracts_detail CD2 ON CD2.contract_id = C2.contract_id
GROUP BY C2.contract_id) L
INNER JOIN contracts_main_list C ON C.id = L.last_main_list_id
AND C.user_id = ?
INNER JOIN contracts_detail CD ON CD.id= L.last_contracts_detail_id
此查询使用FROM
的子查询,因为您提供了以下指示:
contract_ids可能是唯一的,但万一有 某种错误,会有更多的行相同 任何一个表中的contract_id,我只需要选择一行
如果您确定contract_id
是唯一的,那么在contract_id
没有检查的情况下,这是相同的查询:
SELECT CD.*
FROM contracts_main_list C
INNER JOIN contracts_detail CD ON CD.contract_id = C.contract_id
WHERE C.user_id = ?
希望这会对你有所帮助。