在存储过程中,我创建并填充一个临时表(tmpAllUsers),其列为user_id(int),first_name(varchar)和last_name(varchar)。在数据库中,我还有另一个表(操作),该表记录用户每次完成特定操作时的情况。该表的列是user_id(int),action(int)和actionDate(datetime)。
要显示用户在某个时间范围内已完成的操作数量很容易:
SELECT first_name, last_name, actionCount
FROM tmpAllUsers
INNER JOIN (
SELECT user_id, count(*) as actionCount
FROM Actions
WHERE action = 1 and
actionDate >= @sDate and actionDate < @eDate
GROUP BY user_id ) x
ON tmpAllUsers.user_id = x.user_id;
挑战在于返回一个包含所有用户的表,包括actionCount = 0的用户。我尝试的第一种方法使用联合,但是在MySQL中,临时表不能在同一查询中使用两次。我的第二个想法是使用OUTER JOIN,但是出现了不重用临时表的问题。
您能建议一种可行的方法吗?
答案 0 :(得分:0)
如果我理解正确,那么您还希望包括没有与内部查询的限制相匹配的操作的用户,在这种情况下,您可以使用 LEFT JOIN ,当 > actionCount 为 NULL ,替换为零,如下所示:
SELECT
first_name,
last_name,
IFNULL(actionCount, 0)
FROM
tmpAllUsers
LEFT JOIN (
SELECT user_id, count(*) AS actionCount
FROM Actions
WHERE action = 1 AND actionDate >= @sDate AND actionDate < @eDate
GROUP BY user_id ) x ON tmpAllUsers.user_id = x.user_id;