2016-08-22 115 views
0

所以我有一个查询的以下WHERE语句调用存储过程被用在WHERE语句

WHERE 
    (SELECT max(pa.txndate) 
        FROM player_activity pa 
        WHERE pa.userID = customer_profile.userID 
     ) = date(CURDATE()) - INTERVAL 7 DAY 

我的查询实际上有几个其他的子查询,但有人告诉我,我的所有子查询会导致性能下降,因此我需要使用存储过程。

创建以下

CREATE PROCEDURE `getMaxPaDate`() 
BEGIN 
    SELECT userid, max(txndate) 
    FROM player_activity 
    GROUP by userid; 
END 

但是,我没有对如何调用存储过程,所以毫不奇怪,下面并没有为我工作头绪。

WHERE 
    call getMaxPaDate() = date(CURDATE()) - INTERVAL 7 DAY 

帮助?

+0

您需要将其设置为一个函数,而不是一个过程,它将不得不将'userID'作为参数。但我认为这不会改善性能。 – Barmar

回答

0

使其成为存储过程不会提高性能。你需要做的是使用连接。

SELECT cp.* 
FROM customer_profile AS cp 
JOIN (SELECT userID 
     FROM player_activity 
     GROUP BY userID 
     HAVING MAX(pa.txndate) = TODAY() - INTERVAL 7 DAY) AS pa 
ON cp.userID = pa.userID 
+0

我其实只是想出了如何使用较小的表来运行查询。但是,如果我绝对必须使用存储过程(如上所示),那么我将如何在我的where语句中引用它? – eddd83

+0

您不使用存储过程,而是使用函数。然后使用'WHERE func(pa.userID)= cp.userID' – Barmar

相关问题