我有一个查询,它从名为'customers'的表中返回每个CustomerID的最新日期时间。表中有许多不同的CustomerID条目,并且许多行具有相同的CustomerID但具有不同的日期时间条目。我一直在使用下面的查询,每个唯一的CustomerID返回一行,并返回该CustomerID的最新(MAX)日期。该表有大约6000行。
客户表:
CustLogID (Primary key, INT 11)
CustomerID (INT 11)
DateTime (DATETIME)
查询:
SELECT
CustomerID AS custid,
DateTime AS latestdatetime
FROM customers WHERE DateTime IN (
SELECT MAX( DateTime )
FROM customers GROUP BY CustomerID
)
ORDER BY CustomerID
我遇到的麻烦是,在我的开发机器上使用本地MySQL数据库,它会在一秒钟内返回结果(大约1500行),但在我的网络主机上它超时却从未完成任务,相同的PHP脚本,数据库位于Web主机服务器上的数据库数据相同。 Web主机上的所有其他脚本运行正常,其中一些也非常复杂。
如果有人知道为什么这个查询导致了这样的瓶颈或者可以重构它,我将非常感激。
感谢。
答案 0 :(得分:1)
您的查询未按预期执行。它返回的任何客户的datetime
值与表中任何其他客户的最后日期时间相匹配。因此,查询可以为单个客户返回多行,其中每行的datetime
值与其他客户匹配。
我还假设您实际上想要每个客户和的最新行,您想要其他列。否则,简单的group by
就足够了(基本上是你的子查询)。
一个修正是一个相关的子查询:
SELECT c.*
FROM customers c
WHERE c.DateTime = (SELECT MAX(c2.DateTime )
FROM customers c2
WHERE c2.CustomerID = c.CustomerId
)
ORDER BY CustomerID;
为了提高性能,您需要customers(CustomerId, DateTime)
上的索引。
答案 1 :(得分:0)
使用IN
或JOIN
没有意义,可以通过以下方式解决此问题:
SELECT
CustomerID custid,
MAX(DateTime) latestdatetime
FROM customers
GROUP BY CustomerID
ORDER BY CustomerID