对另一个表中的所有ID运行MySql查询

时间:2014-07-03 23:13:54

标签: mysql sql stored-procedures cursor

我有这个查询,它为我提供了数据库中客户端的最后一个交易日期,名字和姓氏。假设我想找到客户端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中执行此操作?或者这是不好的做法?

如果这有任何意义,请告诉我

谢谢!

1 个答案:

答案 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;