仅返回最大值小于指定的行

时间:2013-05-21 13:42:01

标签: mysql sql inner-join max

嗨这对我来说非常棘手(对我来说)。我有三张桌子。

一个包含手机号码和唯一ID(tbldealermobiles)

FCS - Mobile number
1234 - 07464648787
1234 - 07565465465
3566 - 07878989989
7899 - 07464646466
7899 - 07565465464
9654 - 07589898998 

一个包含购买日期和唯一ID以及其他详细信息(tblhistory)

FCS - purchase date - purchased
1234 - 22/04/2013 - gloves
1234 - 14/03/2013 - hat
1234 - 01/03/2013 - coat
3566 - 20/04/2013 - gloves
3566 - 19/04/2012 - hat
7899 - 14/03/2013 - shoes
9654 - 24/05/2013 - hat
9654 - 19/04/2013 - shoes

一个包含客户类型和唯一ID以及其他详细信息。 (tblAllDealers)

FCS - Cust type - name
1234 - Virtual - Jim
3566 - Outbound - Jon
7899 - Virtual - Jack
9654 - Outbound - Susan

当我想要显示超过30天前已经购买的客户(如果他们是'出站')以及超过60天前他们是虚拟的时,我的问题就出现了。

我只想归还Jon和Jack的所有手机号码,因为其他人已经为他们的客户类型指定了日期。

我正在使用INNER JOIN链接唯一ID(FCS)上的3个表,我使用MAX只返回MAX值小于日期的值,但我不知道如何添加条件来指定两个不同的日期。

这是我到目前为止的查询 -

SELECT *
FROM tbldealermobiles
  INNER JOIN tblhistory ON tbldealermobiles.FCS = tblhistory.FCS
  INNER JOIN tblAllDealers ON tbldealermobiles.FCS = tblAllDealers.FCS
WHERE (tblAllDealers.CustGroup = 'Virtual' AND
       tblhistory.PurchaseDate < date('2013-03-22'))
    OR 
      (tblAllDealers.CustGroup = 'Outbound' AND 
       tblhistory.PurchaseDate < date('2013-04-21')) 
GROUP BY tbldealermobiles.mobilenumber 
HAVING MAX(tblhistory.PurchaseDate) < date('2013-04-21') 
ORDER BY tblhistory.PurchaseDate DESC

问题是FCS的购买日期可能总是早于指定的日期,但我只想在指定的日期之后返回一个没有购买日期的手机号码,具体取决于客户群。

提前感谢您的帮助。

编辑:感谢格式化我的代码Dukeling。

1 个答案:

答案 0 :(得分:2)

您希望将条件从联接中拉入having子句。该联接仅 在这些日期之前查看记录,因此您不知道之后是否发生任何事情。

SELECT *
FROM tbldealermobiles
  INNER JOIN tblhistory ON tbldealermobiles.FCS = tblhistory.FCS
  INNER JOIN tblAllDealers ON tbldealermobiles.FCS = tblAllDealers.FCS
WHERE tblAllDealers.CustGroup in ('Virtual', 'Outbound')
GROUP BY tbldealermobiles.mobilenumber 
HAVING MAX(tblhistory.PurchaseDate) <
            MAX(case when tblAllDealers.CustGroup = 'Virtual' then date('2013-03-22')
                     when tblAllDealers.CustGroup = 'Outbound' then date('2013-04-21')
                end)
ORDER BY tblhistory.PurchaseDate DESC