根据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); 

答案很可能是可笑的明显,我只是没有看到它。

+1

如果您喜欢,请考虑遵循以下简单的两步操作步骤:1.如果您尚未这样做,请提供适当的CREATE和INSERT语句(和/或sqlfiddle),以便我们可以更轻松地复制问题。 2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。 – Strawberry

+1

dmcoding,我认为您已将'LEFT JOIN'倒置。应该是'客户离开加入合同',这意味着关系是0到很多...不是1到很多。 –

由于最近期合约将是一个具有最高a.contract_id,只需ORDER BYLIMIT 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 
+0

这将导致1条记录,如果您删除'WHERE',它将不起作用。 – sagi

+0

我错了,因为你已经过滤了user_id。这应该工作。但删除外部'SELECT * FROM' –

+0

@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子句结合使用。