2

これで高速なSQLクエリを取得するのに少し問題があります。必要な結果を返すクエリを取得することができましたが、適切なインデックスを使用しても実行に約 2 秒かかります。

私はこれらのテーブルを持っています:

[Login]
loginID
loginTime
userID

[user]
userID 
userName

[companyParticipant]
userID
companyID

[company]
companyID
organisationID
CompanyName

表示したいのは、loginTime を持つ最新のログイン上位 10 人すべてです。ユーザーが私が参加している会社、または私がその組織の会社のメンバーである組織内の会社にいる場合

組織を取得するには:

SELECT organisationID 
FROM companys 
WHERE companyID IN (
    SELECT companyID 
    FROM companyParticipant 
    WHERE userID = @userID) 
GROUP BY organisationID 

だから私が欲しいのは次のようなクエリです:

SELECT TOP 10 userName, LoginTime 
FROM ....
ORDER BY loginID
4

2 に答える 2

0

このクエリは1秒未満で、超高速です。常にログインしている人がいて、新しいログインは10分間隔である必要があるため、タイブレークの必要はないようです。そうでない場合は、最後のログインが更新されるだけです。

SELECT      TOP (10) l.loginID, l.loginTime,u.userName
FROM          logins AS l WITH(NOLOCK) INNER JOIN
                        users AS u WITH(NOLOCK) ON l.UserID = u.UserID
WHERE      (l.UserID <> @userID)
AND u.userID IN(SELECT u.userID FROM companyParticipants AS sp2 WHERE sp2.companyID IN (SELECT sc2.companyID FROM company AS sc2 WHERE sc2.organisationID IN(
SELECT sc.organisationID FROM company AS sc LEFT JOIN companyParticipants AS sp ON sc.companyID = sp.companyID WHERE sp.userID = @userID AND sc.organisationID > 0 GROUP BY sc.organisationID
)))
ORDER BY l.loginID DESC
于 2012-10-14T19:21:41.493 に答える
0
    SELECT userName, loginTime
      FROM
(
    SELECT u.userName, l.loginTime,
           rn = row_number() over (partition BY u.userName
                              ORDER BY l.loginTime DESC)
      FROM companyParticipant cp
      JOIN companys c ON c.companyID = cp.companyID
      JOIN companys c2 ON c2.organisationID = c.organisationID -- same organisation
      JOIN companyParticipant cp2 ON cp2.companyID = c2.companyID -- participants of same org
      JOIN login l ON l.userID = cp2.userID
      JOIN [user] u ON u.userID = l.userID
     WHERE cp.userID = @userID
)          X
     WHERE rn = 1
  ORDER BY loginTime DESC
于 2012-10-12T16:19:39.290 に答える