3

ユーザーテーブルをアクティビティログテーブルに結合し、ユーザーごとに次を返すクエリを作成しようとしています。

A)最後にログインした時刻。

B)過去3か月間のログイン数。

これは私がこれまでに思いついたものです:

SELECT A.UserID, COUNT( Activity ) AS Logins, MAX( TIME ) AS LastLogin  
FROM UserMaster A  
LEFT JOIN UserWebActivity B ON A.UserID = B.UserID  
AND Activity =  'Login'  
AND TIME BETWEEN DATE_SUB( NOW( ) , INTERVAL 3 MONTH ) AND NOW( )  
GROUP BY A.UserID  

これはほぼ機能しますが、過去3か月以内にログインしていないユーザーの最新のログインは返されません。count()とmax()を正しく連携させるにはどうすればよいですか?

4

3 に答える 3

4

まず、各問題を個別に解決します。

SELECT A.UserID, MAX(TIME) AS LastLogin  
FROM UserMaster A  
LEFT JOIN UserWebActivity B
ON A.UserID = B.UserID  
AND Activity = 'Login'  
GROUP BY A.UserID

SELECT A.UserID, COUNT(Activity) AS Logins
FROM UserMaster A  
LEFT JOIN UserWebActivity B ON A.UserID = B.UserID  
AND Activity = 'Login'  
AND TIME BETWEEN (NOW() - INTERVAL 3 MONTH) AND NOW( )  
GROUP BY A.UserID

それらを個別にテストして、これらの各クエリが希望どおりに機能することを確認し、必要に応じて調整します。

次に、両方が機能することに満足したら、結果を結合します。

SELECT T1.UserID, T1.LastLogin, T2.Logins
FROM
(
    SELECT A.UserID, MAX(TIME) AS LastLogin  
    FROM UserMaster A  
    LEFT JOIN UserWebActivity B
    ON A.UserID = B.UserID  
    AND Activity = 'Login'  
    GROUP BY A.UserID
) AS T1
JOIN
(
    SELECT A.UserID, COUNT(Activity) AS Logins
    FROM UserMaster A  
    LEFT JOIN UserWebActivity B
    ON A.UserID = B.UserID  
    AND Activity = 'Login'
    AND TIME BETWEEN (NOW() - INTERVAL 3 MONTH) AND NOW()
    GROUP BY A.UserID
) AS T2
ON T1.UserID = T2.UserID

これにより、MySQLはさまざまなクエリのインデックスを最大限に活用できるようになります。

于 2012-06-25T18:34:12.347 に答える
3

あなたはあなたの:でCASEステートメントを使うことができますCOUNT

SELECT A.UserID,
  COUNT(
    CASE WHEN TIME BETWEEN DATE_SUB( NOW( ) , INTERVAL 3 MONTH ) AND NOW( )
    THEN Activity
  END ) AS Logins,
  MAX( TIME ) AS LastLogin  
FROM UserMaster A  
LEFT JOIN UserWebActivity B ON A.UserID = B.UserID  
AND Activity =  'Login'  
GROUP BY A.UserID

ただし、大量のデータがある場合、このソリューションは@MarkByersよりも効率が低くなります。

于 2012-06-25T18:35:11.597 に答える
0

もう1つのクレイジーなアイデアと同じように-MAX(TIME)の代わりに

coalesce(max(time), (select max(time) from UserWebActivity where ...) )
于 2012-06-25T18:38:25.453 に答える