我有这个查询,它为我提供了数据库中客户端的最后一个交易日期,名字和姓氏。假设我想找到客户端13423的最后一个交易日期,这是查询:
SELECT LastTransactionDate AS was_last_seen,
(SELECT DISTINCT(FirstName) FROM Clients WHERE PmsId=13423) AS FirstName,
(SELECT DISTINCT(LastName) FROM Clients WHERE PmsId=13423) AS LastName
FROM(
SELECT DISTINCT(pa.PmsId),pa.LastTransactionDate,cpr.ClientPmsId
FROM Patients AS pa RIGHT JOIN ClientPatientRelationships AS cpr ON
pa.PmsId=cpr.PatientPmsId WHERE cpr.ClientPmsId = 13423
) AS result ORDER BY LastTransactionDate DESC LIMIT 1;
现在我想在客户端表中的每个客户端上运行它。
我可以找到所有客户的列表:
SELECT DISTINCT(PmsId) AS distinct_clients FROM Clients;
我是SQL的新手,无论如何我可以在所有客户端上运行它吗?我希望在一个查询中这样做,但我不确定它是否可行。
我也尝试使用带光标的SP,但由于某种原因,光标为每个PmsId获取两个结果,但我的SELECT DISTINCT(PmsId)查询返回DISTINCT ID列表,因此不确定光标是如何运行的单个PmsId通过主查询两次。
此外,光标速度超慢,运行6分钟后超时,这很奇怪,因为我只有大约14,000个客户端,而我使用的上述查询在单个客户端上运行的时间少于一秒。
我想知道我是否应该尝试在PHP中执行此操作?或者这是不好的做法?
如果这有任何意义,请告诉我
谢谢!
答案 0 :(得分:2)
使用max(b.LastTransactionDate)
和group by a.ClientPmsId
查找每个客户端的LastTransactionDate
,然后将其加入Clients
表以获取姓名。
select a.PmsId, a.FirstName, a.LastName, b.LastTransactionDate
from (select PmsId, FirstName, LastName
from Clients
group by PmsId) a
left join (select a.ClientPmsId, max(b.LastTransactionDate) LastTransactionDate
from ClientPatientRelationships a
join Patients b on a.PatientPmsId = b.PmsId
group by a.ClientPmsId) b on a.PmsId = b.ClientPmsId;