我有一个系统,其中商店是一个帐户,顾客在这些商店购物。有一个表存储客户和商店的多对多关联。该表的关键属性是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个+客户。
任何帮助都将不胜感激。
答案 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?的答案。