根据MAX日期和客户ID获取数据
我有两个表格:客户和合同。它们之间的公共密钥是customer_id。我需要链接这两张表来表示我的虚构业务是否与客户签订合同。根据MAX日期和客户ID获取数据
客户 - >合同表具有一对多的关系,因此客户可以有记录的旧合同。我想要最新的。这目前由自动递增的contract_id处理。
我的查询应该根据customer_id和该customer_id的最大contract_id获取合同数据。
我的查询目前看起来是这样的:
SELECT * FROM(
SELECT co.*
FROM contracts co
LEFT JOIN customers c ON co.customer_id = c.customer_id
WHERE co.customer_id ='135') a
where a.contract_id = MAX(a.contract_id);
答案很可能是可笑的明显,我只是没有看到它。
由于最近期合约将是一个具有最高a.contract_id
,只需ORDER BY
和LIMIT 1
SELECT * FROM(
SELECT co.*
FROM contracts co
LEFT JOIN customers c ON co.customer_id = c.customer_id
WHERE co.customer_id ='135') a
ORDER BY a.contract_id DESC
LIMIT 1
这将导致1条记录,如果您删除'WHERE',它将不起作用。 – sagi
我错了,因为你已经过滤了user_id。这应该工作。但删除外部'SELECT * FROM' –
@sagi,为什么不工作?我一开始读错了这个问题。但看起来像OP只想要一个记录 –
您可以使用NOT EXISTS()
:
SELECT * FROM contracts c
LEFT JOIN customers co
ON(co.customer_id = c.customer_id)
WHERE co.customer_id = '135'
AND NOT EXISTS(SELECT 1 FROM contracts co2
WHERE co2.customer_id = co.customer_id
AND co2.contract_id > co.contract_id)
这将确保它是最新的合同,它对所有客户都是动态的,您只需删除WHERE co.customer_id = '135'
即可获得所有结果。
通常,您不能在WHERE
子句上使用聚合函数,只能在HAVING()
上使用聚合函数,该函数通常会与GROUP BY
子句结合使用。
如果您喜欢,请考虑遵循以下简单的两步操作步骤:1.如果您尚未这样做,请提供适当的CREATE和INSERT语句(和/或sqlfiddle),以便我们可以更轻松地复制问题。 2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。 – Strawberry
dmcoding,我认为您已将'LEFT JOIN'倒置。应该是'客户离开加入合同',这意味着关系是0到很多...不是1到很多。 –