MySQL查询内存不足

时间:2016-11-16 19:08:21

标签: php mysql laravel

我有一个系统,其中商店是一个帐户,顾客在这些商店购物。有一个表存储客户和商店的多对多关联。该表的关键属性是accountid,customerid和last_visit_date。对于一组accountids,我需要找到每个客户的最近访问。我有一个完美的查询,但似乎效率低下,因为它耗尽了大约21000个客户的内存。

SELECT ac.customerId FROM account_customer ac 
      INNER JOIN (SELECT customerId, max(last_visit_date) AS 
                     LastVisitDate FROM account_customer 
                  WHERE accountId in        
                     (311,307,318,320,321,322,323,332,347,439,519,630,634,643) 
                 GROUP BY customerId) grouped_ac 
     ON ac.customerId = grouped_ac.customerId 
          AND ac.last_visit_date = grouped_ac.LastVisitDate 
          AND ac.last_visit_date <= '2016-10-18' 
          OR ac.last_visit_date is null

当我运行上述查询时,它为较小的数据集提供了正确的结果,但对于较大的数据集,我得到了内存错误。我甚至没有谈论一个非常大的集合 - 大约20,000个+客户。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

你可能意味着

ac.customerId = grouped_ac.customerId 
AND ac.last_visit_date = grouped_ac.LastVisitDate 
and (ac.last_visit_date <= '2016-10-18' or ac.last_visit_date is null)

我认为没有括号,查询可能会返回last_visit_date为空的所有记录。

查看How exactly does using OR in a MySQL statement differ with/without parentheses?的答案。