0

私はSQLが得意ではなく、デザイナーはOVERの使用では機能しないため、これに苦労しています。基本的に、ユーザーが関連付けられたタグをフォローしている場合、これはトピックのリストを取得しています。

T.TopicId重複を防ぐためにグループ化する必要があります。ユーザーがトピックに関連付けられた複数のタグを選択している場合、トピックは 2 回 (タグごとに 1 回) リストされます。

SQLでグループを追加すると、複数のエラーが発生し、並べ替えを試みましたが、機能しません.SQLステートメントでは役に立たないと言われました

@id int = null
AS
SELECT
*
FROM
(SELECT
    ROW_NUMBER()
        OVER 
            (ORDER BY TopicOrder desc
             ,
             (CASE 
                WHEN M.MessageCreationDate > T.TopicCreationDate THEN M.MessageCreationDate
                ELSE T.TopicCreationDate
            END) desc)
        AS RowNumber
    ,T.TopicId, T.TopicTitle, T.TopicShortName, T.TopicDescription, T.TopicCreationDate, T.TopicViews, T.TopicReplies, T.UserId, T.TopicTags, T.TopicIsClose, 
                     T.TopicOrder, T.LastMessageId, T.UserName, M.MessageCreationDate, M.UserId     AS MessageUserId, MU.UserName AS MessageUserName, U.UserGroupId, 
                     U.UserPhoto, T.UserFullName
FROM            Tags INNER JOIN
                     TopicsComplete AS T ON T.TopicId = Tags.TopicId LEFT OUTER JOIN
                     Messages AS M ON M.TopicId = T.TopicId AND M.MessageId = T.LastMessageId AND     M.Active = 1 LEFT OUTER JOIN
                     Users AS MU ON MU.UserId = M.UserId LEFT OUTER JOIN
                     Users AS U ON U.UserId = T.UserId LEFT OUTER JOIN
                     tagfollows AS TF ON @id = TF.userid
WHERE        (Tags.Tag = TF.tag)
 )T 

誰かがそれを助けることができれば、とても感謝しています、ありがとう! :)

4

2 に答える 2

0

ユーザーがフォローしているセット内のタグ付きの投稿を表示したいが、一致するタグが複数ある場合に投稿が複数回表示されるのは望ましくないとします。EXISTSこれはsubqueryの完璧な使い方です。その MSDN ページの例を次に示します。

SELECT a.FirstName, a.LastName
FROM Person.Person AS a
WHERE EXISTS
(SELECT * 
    FROM HumanResources.Employee AS b
    WHERE a.BusinessEntityID = b.BusinessEntityID
    AND a.LastName = 'Johnson');

person テーブル (posts テーブルなど) に本当に関心がありますが、employee に一致するレコードが少なくとも 1 つあるレコード (tags テーブルなど) を表示したいとします。

于 2013-03-23T16:13:01.597 に答える
0

結合をサブクエリに変換するだけでよいと思います(そして冗長なネストを削除しますtagfollows):EXISTS

SELECT
    ROW_NUMBER()
        OVER ( ORDER BY TopicOrder desc
                      , CASE WHEN M.MessageCreationDate > T.TopicCreationDate 
                            THEN M.MessageCreationDate
                            ELSE T.TopicCreationDate
                        END desc )
        AS RowNumber,
    T.TopicId, T.TopicTitle, T.TopicShortName, T.TopicDescription, 
    T.TopicCreationDate, T.TopicViews, T.TopicReplies, T.UserId, 
    T.TopicTags, T.TopicIsClose, T.TopicOrder, T.LastMessageId, 
    T.UserName, M.MessageCreationDate, 
    M.UserId    AS MessageUserId, 
    MU.UserName AS MessageUserName, 
    U.UserGroupId, U.UserPhoto, T.UserFullName
FROM
        TopicsComplete AS T
    LEFT OUTER JOIN
        Messages AS M        ON  M.TopicId = T.TopicId 
                             AND M.MessageId = T.LastMessageId
                             AND M.Active = 1 
    LEFT OUTER JOIN
        Users AS MU          ON  MU.UserId = M.UserId 
    LEFT OUTER JOIN
        Users AS U           ON  U.UserId = T.UserId
WHERE   EXISTS
        ( SELECT  *
          FROM    Tags
              INNER JOIN tagfollows AS TF
                  ON  Tags.Tag = TF.tag 
          WHERE   T.TopicId = Tags.TopicId 
            AND   @id = TF.userid   
        ) ;
于 2013-03-23T16:17:33.763 に答える