টাইম স্ট্যাম্পের উপর ভিত্তি করে অফ উইন্ডিং অফসেট


10

আমি একটি ক্যোয়ারী লিখছি যা সামাজিক ফিডের ফলাফলের ফলাফলের জন্য ব্যবহৃত হবে। ধারণাটি হ'ল মোবাইল অ্যাপ্লিকেশনটি এন আইটেমগুলির জন্য অনুরোধ করবে এবং আমি একটি নীচে সময় শুরু করব যা আমি @CutoffTimeনীচে কল করেছি। কাট অফের সময়টির উদ্দেশ্য হ'ল কখন পেজিং উইন্ডোটি শুরু হবে। আমরা কেন সারি অফসেটের পরিবর্তে টাইম স্ট্যাম্প ব্যবহার করছি তার কারণ হ'ল টাইম স্ট্যাম্পটি নতুন সামাজিক সামগ্রী যুক্ত করা সত্ত্বেও পুরানো পোস্ট পাওয়ার সময় আমাদের একটি সামঞ্জস্যপূর্ণ জায়গা থেকে পৃষ্ঠাগুলি দেয়।

যেহেতু সামাজিক ফিড আইটেমগুলি নিজের বা আপনার বন্ধুদের হতে পারে আমি UNIONএই দুটি গ্রুপের ফলাফলগুলিকে একত্রিত করতে একটি ব্যবহার করছি । মূলত আমি TheQuery_CTEছাড়া যুক্তিটি চেষ্টা করেছিলাম UNIONএবং এটি কুকুর ধীর ছিল।

এটি আমিই করেছি (প্রাসঙ্গিক টেবিল স্কিমা সহ):

    CREATE TABLE [Content].[Photo]
(
    [PhotoId] INT NOT NULL PRIMARY KEY IDENTITY (1, 1), 
    [Key] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(),
    [FullResolutionUrl] NVARCHAR(255) NOT NULL, 
    [Description] NVARCHAR(255) NULL, 
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
);

CREATE TABLE [Content].[UserPhotoAssociation]
(
    [PhotoId] INT NOT NULL, 
    [UserId] INT NOT NULL, 
    [ShowInSocialFeed] BIT NOT NULL DEFAULT 0,

    CONSTRAINT [PK_UserPhotos] PRIMARY KEY ([PhotoId], [UserId]), 
    CONSTRAINT [FK_UserPhotos_User] FOREIGN KEY ([UserId]) 
        REFERENCES [User].[User]([UserId]), 
    CONSTRAINT [FK_UserPhotos_Photo] FOREIGN KEY ([PhotoId]) 
        REFERENCES [Content].[Photo]([PhotoId])
);

CREATE TABLE [Content].[FlaggedPhoto]
(
    [FlaggedPhotoId] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    [PhotoId] INT NOT NULL,
    [FlaggedBy] INT NOT NULL,
    [FlaggedOn] DATETIME2(0) NOT NULL DEFAULT SYSDATETIME(),
    [FlaggedStatus] INT NOT NULL DEFAULT 1,
    [ReviewedBy] INT NULL,
    [ReviewedAt] DATETIME2(0) NULL

    CONSTRAINT [FK_Photos_PhotoId_to_FlaggedPhotos_PhotoId] FOREIGN KEY ([PhotoId]) 
        REFERENCES [Content].[Photo]([PhotoId]),
    CONSTRAINT [FK_FlaggedPhotoStatus_FlaggedPhotoStatusId_to_FlaggedPhotos_FlaggedStatus] FOREIGN KEY ([FlaggedStatus]) 
        REFERENCES [Content].[FlaggedContentStatus]([FlaggedContentStatusId]),
    CONSTRAINT [FK_User_UserId_to_FlaggedPhotos_FlaggedBy] FOREIGN KEY ([FlaggedBy]) 
        REFERENCES [User].[User]([UserId]),
    CONSTRAINT [FK_User_UserId_to_FlaggedPhotos_ReviewedBy] FOREIGN KEY ([ReviewedBy]) 
        REFERENCES [User].[User]([UserId])
);


CREATE TABLE [User].[CurrentConnections]
(
    [MonitoringId] INT NOT NULL PRIMARY KEY IDENTITY,
    [Monitor] INT NOT NULL,
    [Monitored] INT NOT NULL,
    [ShowInSocialFeed] BIT NOT NULL DEFAULT 1,

    CONSTRAINT [FK_Monitoring_Monitor_to_User_UserId] FOREIGN KEY ([Monitor]) 
         REFERENCES [dbo].[User]([UserId]),
    CONSTRAINT [FK_Monitoring_Monitored_to_User_UserId] FOREIGN KEY ([Monitored]) 
         REFERENCES [dbo].[User]([UserId])
);

CREATE TABLE [Content].[PhotoLike]
(
    [PhotoLikeId] INT NOT NULL PRIMARY KEY IDENTITY,
    [PhotoId] INT NOT NULL,
    [UserId] INT NOT NULL,
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
    [Archived] DATETIME2(2) NULL,

    CONSTRAINT [FK_PhotoLike_PhotoId_to_Photo_PhotoId] FOREIGN KEY ([PhotoId]) 
         REFERENCES [Content].[Photo]([PhotoId]),
    CONSTRAINT [FK_PhotoLike_UserId_to_User_UserId] FOREIGN KEY ([UserId]) 
         REFERENCES [User].[User]([UserId])
);

CREATE TABLE [Content].[Comment]
(
    [CommentId] INT NOT NULL PRIMARY KEY IDENTITY,
    [PhotoId] INT NOT NULL,
    [UserId] INT NOT NULL,
    [Comment] NVARCHAR(255) NOT NULL,
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
    [CommentOrder] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
    [Archived] DATETIME2(2) NULL,

    CONSTRAINT [FK_Comment_PhotoId_to_Photo_PhotoId] FOREIGN KEY ([PhotoId]) 
         REFERENCES [Content].[Photo]([PhotoId]),
    CONSTRAINT [FK_Comment_UserId_to_User_UserId] FOREIGN KEY ([UserId]) 
         REFERENCES [User].[User]([UserId])
);

/*

      End table schema

*/



DECLARE @UserId INT,
    @NumberOfItems INT,
    @CutoffTime DATETIME2(2) = NULL -- Stored Proc input params

-- Make the joins and grab the social data we need once since they are used in subsequent queries that aren't shown
DECLARE @SocialFeed TABLE ([Key] UNIQUEIDENTIFIER, [PhotoId] INT
            , [Description] NVARCHAR(255), [FullResolutionUrl] NVARCHAR(255)
            , [Created] DATETIME2(2), [CreatorId] INT, [LikeCount] INT
            , [CommentCount] INT, [UserLiked] BIT);
-- Offset might be different for each group
DECLARE @OffsetMine INT = 0, @OffsetTheirs INT = 0;

IF @CutoffTime IS NOT NULL
    BEGIN
        -- Get the offsets
        ;WITH [GetCounts_CTE] AS
        (
            SELECT
                [P].[PhotoId] -- INT
                , 1 AS [MyPhotos]
            FROM [Content].[Photo] [P]
                INNER JOIN [Content].[UserPhotoAssociation] [UPA] ON 
                    [UPA].[PhotoId] = [P].[PhotoId] 
                    AND 
                    [UPA].[ShowInSocialFeed] = 1
                LEFT JOIN [Content].[FlaggedPhoto] [FP] ON 
                    [FP].[PhotoId] = [P].[PhotoId] 
                    AND 
                    [FP].[FlaggedStatus] = 3 -- Flagged photos that are confirmed apply to everyone
            WHERE
                [FP].[FlaggedPhotoId] IS NULL -- Filter out flagged photos
                AND
                [UPA].[UserId] = @UserId -- Show the requesting user
                AND
                [P].[Created] >= @CutoffTime -- Get the newer items
            UNION
            SELECT
                [P].[PhotoId] -- INT
                , 0 AS [MyPhotos]
            FROM [Content].[Photo] [P]
                INNER JOIN [Content].[UserPhotoAssociation] [UPA] ON 
                    [UPA].[PhotoId] = [P].[PhotoId] 
                    AND 
                    [UPA].[ShowInSocialFeed] = 1
                INNER JOIN [User].[CurrentConnections] [M] ON 
                    [M].[Monitored] = [UPA].[UserId] 
                    AND 
                    [M].[Monitor] = @UserId AND [M].[ShowInSocialFeed] = 1 -- this join isn't present above  
                LEFT JOIN [Content].[FlaggedPhoto] [FP] ON 
                    [FP].[PhotoId] = [P].[PhotoId] 
                    AND 
                    (
                        [FP].[FlaggedStatus] = 3 
                        OR 
                        ([FP].[FlaggedBy] = @UserId AND [FP].[FlaggedStatus] = 1)
                    ) -- Flagged photos that are confirmed apply to everyone, pending flags apply to the user
            WHERE
                [FP].[FlaggedPhotoId] IS NULL -- Filter out flagged photos
                AND
                [P].[Created] >= @CutoffTime -- Get the newer items
        )
        SELECT
            @OffsetMine = SUM(CASE WHEN [MyPhotos] = 1 THEN 1 ELSE 0 END)
            , @OffsetTheirs = SUM(CASE WHEN [MyPhotos] = 0 THEN 1 ELSE 0 END)
        FROM [GetCounts_CTE]
    END

-- Prevent absence of social data from throwing an error below.
SET @OffsetMine = ISNULL(@OffsetMine, 0); 
SET @OffsetTheirs = ISNULL(@OffsetTheirs, 0);

-- Actually select the data I want
;WITH TheQuery_CTE AS
(
    SELECT
        [P].[Key]
        , [P].[PhotoId]
        , [P].[Description]
        , [P].[FullResolutionUrl]
        , [P].[Created]
        , [UPA].[UserId]
        , COUNT(DISTINCT [PL].[PhotoLikeId]) AS [LikeCount] -- Count distinct used due to common join key
        , COUNT(DISTINCT [C].[CommentId]) AS [CommentCount]
        , CAST(ISNULL(MAX(CASE WHEN [PL].[UserId] = @UserId THEN 1 END), 0) AS BIT) AS [UserLiked]
    FROM [Content].[Photo] [P]
        INNER JOIN [Content].[UserPhotoAssociation] [UPA] ON 
            [UPA].[PhotoId] = [P].[PhotoId] 
            AND 
            [UPA].[ShowInSocialFeed] = 1
        LEFT JOIN [Content].[PhotoLike] [PL] ON 
            [PL].[PhotoId] = [P].[PhotoId] 
            AND 
            [PL].[Archived] IS NULL
        LEFT JOIN [Content].[Comment] [C] ON 
            [C].[PhotoId] = [P].[PhotoId] 
            AND 
            [C].[Archived] IS NULL
        LEFT JOIN [Content].[FlaggedPhoto] [FP] ON 
            [FP].[PhotoId] = [P].[PhotoId] 
            AND 
            [FP].[FlaggedStatus] = 3 -- Flagged photos that are confirmed apply to everyone
    WHERE
        [FP].[FlaggedPhotoId] IS NULL -- Filter out flagged photos
        AND
        [UPA].[UserId] = @UserId -- Show the requesting user
    GROUP BY
        [P].[Key]
        , [P].[PhotoId]
        , [P].[Description]
        , [P].[FullResolutionUrl]
        , [P].[Created]
        , [UPA].[UserId]
    ORDER BY  
        [P].[Created] DESC
        , [P].[Key]  -- Ensure consistent order in case of duplicate timestamps
        OFFSET @OffsetMine ROWS FETCH NEXT @NumberOfItems ROWS ONLY
    UNION
    SELECT
        [P].[Key]
        , [P].[PhotoId]
        , [P].[Description]
        , [P].[FullResolutionUrl]
        , [P].[Created]
        , [UPA].[UserId]
        , COUNT(DISTINCT [PL].[PhotoLikeId]) AS [LikeCount]
        , COUNT(DISTINCT [C].[CommentId]) AS [CommentCount]
        , CAST(ISNULL(MAX(CASE WHEN [PL].[UserId] = @UserId THEN 1 END), 0) AS BIT) AS [UserLiked]
    FROM [Content].[Photo] [P]
        INNER JOIN [Content].[UserPhotoAssociation] [UPA] ON 
            [UPA].[PhotoId] = [P].[PhotoId] 
            AND 
            [UPA].[ShowInSocialFeed] = 1
        INNER JOIN [User].[CurrentConnections] [M] ON 
            [M].[Monitored] = [UPA].[UserId] 
            AND 
            [M].[Monitor] = @UserId AND [M].[ShowInSocialFeed] = 1
        LEFT JOIN [Content].[PhotoLike] [PL] ON 
            [PL].[PhotoId] = [P].[PhotoId] 
            AND 
            [PL].[Archived] IS NULL
        LEFT JOIN [Content].[Comment] [C] ON 
            [C].[PhotoId] = [P].[PhotoId] 
            AND 
            [C].[Archived] IS NULL
        LEFT JOIN [Content].[FlaggedPhoto] [FP] ON 
            [FP].[PhotoId] = [P].[PhotoId] 
            AND 
            (
                [FP].[FlaggedStatus] = 3 
                OR 
                ([FP].[FlaggedBy] = @UserId AND [FP].[FlaggedStatus] = 1)
            ) -- Flagged photos that are confirmed apply to everyone, pending flags apply to the user
    WHERE
        [FP].[FlaggedPhotoId] IS NULL -- Filter out flagged photos
    GROUP BY
        [P].[Key]
        , [P].[PhotoId]
        , [P].[Description]
        , [P].[FullResolutionUrl]
        , [P].[Created]
        , [UPA].[UserId]
    ORDER BY  
        [P].[Created] DESC
        , [P].[Key]  -- Ensure consistant order in case of duplicate timestamps
        OFFSET @OffsetTheirs ROWS FETCH NEXT @NumberOfItems ROWS ONLY
)
INSERT INTO @SocialFeed ([Key], [PhotoId], [Description], [FullResolutionUrl]
            , [Created], [CreatorId], [LikeCount], [CommentCount], [UserLiked])
SELECT TOP (@NumberOfItems)
    [Key]
    , [PhotoId]
    , [Description]
    , [FullResolutionUrl]
    , [Created]
    , [UserId]
    , [LikeCount]
    , [CommentCount]
    , [UserLiked]
FROM [TheQuery_CTE]
ORDER BY  -- Order here so the top works properly
    [Created] DESC
    , [Key]  -- Ensure consistent order in case of duplicate timestamps

-- Output the social feed
SELECT
    [P].[Key]
    , [P].[PhotoId]
    , [P].[Description] AS [PhotoDescription]
    , [P].[FullResolutionUrl]
    , [P].[Created] AS [Posted]
    , [P].[CreatorId]
    , [LikeCount]
    , [CommentCount]
    , [UserLiked]
FROM @Photos [P]

-- Select other data needed to build the object tree in the application layer

আমি পরিত্রাণ পেতে পারেন উপলব্ধি UNIONমধ্যে GetCounts_CTEকিন্তু আমি মনে করি না এটা সত্যিই সমস্যার আমি নিচে দেখুন কোন সমাধান হবে না।

আমি কয়েকটি সম্ভাব্য সমস্যা দেখতে পাচ্ছি:

  1. এটি প্রচুর নকল যুক্তি তাই আমি সম্ভবত নিজের জন্য জীবনকে আরও কঠিন করে তুলছি।
  2. যদি কোনও সন্নিবেশ গণনা গণনা এবং ডেটা নির্বাচন করার মধ্যে ঘটে তবে আমি বন্ধ হয়ে যাব। আমি মনে করি না এটি ঘন ঘন ঘটবে তবে এটি বাগগুলি ডিবাগ করার জন্য অদ্ভুত / শক্ত হয়ে উঠবে।
  3. উপরোক্ত সেটআপটি দিয়ে লোকেরা সমস্ত সমস্যাগুলি স্মার্ট / আরও বেশি অভিজ্ঞতার সন্ধান করবে।

এই কোয়েরিটি লেখার সর্বোত্তম উপায় কী? বোনাসটি সমাধানটিকে আমার জীবনকে সহজ করে তুলেছে।

সম্পাদনা:

আমি সমস্ত ডেটা নির্বাচন করতে এবং ক্লায়েন্টকে আলস্যভাবে আইটেমগুলি প্রদর্শন করতে চাই না, কারণ আমি জনগণের ডেটা পরিকল্পনাগুলি জোর করে আইটেমগুলি তারা কখনই দেখতে পাবে না তা ডাউনলোড করে তাদের অপব্যবহার করতে চাই না। স্বীকার করা যায় যে তথ্যগুলি গ্র্যান্ড স্কিমের ক্ষেত্রে এত বড় হবে না তবে পেনি স্ট্যাকআপ ....

সম্পাদনা 2:

আমি দৃ strongly়ভাবে সন্দেহ করি যে এটি সর্বোত্তম সমাধান নয়, তবে আমি এখন পর্যন্ত এটাই সেরা।

গ্রেগের মতো আমার UNIONক্যোয়ারিকে স্থানান্তরিত করার পরামর্শ দিয়েছিল যে সেই যুক্তিটি আড়াল করতে এবং আমার সঞ্চিত পদ্ধতিতে আরও সংক্ষিপ্ত কোয়েরি দিতে ভাল কাজ করেছে। এই দৃষ্টিভঙ্গি ইউনিয়নের কুৎসিততা / জটিলতা দূরে রাখে যা ভাল কারণ কারণ আমি এটি আমার নির্বাচনে দুবার ব্যবহার করছি using দেখার জন্য কোডটি এখানে:VIEW

CREATE VIEW [Social].[EverFeed]
    AS 
SELECT
    [P].[Key]
    , [P].[PhotoId]
    , [P].[Description]
    , [P].[FullResolutionUrl]
    , [P].[Created]
    , [UPA].[UserId]
    , COUNT(DISTINCT [PL].[PhotoLikeId]) AS [LikeCount] -- Distinct due to common join key
    , COUNT(DISTINCT [C].[CommentId]) AS [CommentCount]
    , CAST(ISNULL(
        MAX(CASE WHEN [PL].[UserId] = [UPA].[UserId] THEN 1 END), 0) AS BIT) AS [UserLiked]
    , NULL AS [Monitor]
FROM [Content].[Photo] [P]
    INNER JOIN [Content].[UserPhotoAssociation] [UPA] ON 
        [UPA].[PhotoId] = [P].[PhotoId] 
        AND 
        [UPA].[ShowInSocialFeed] = 1
    LEFT JOIN [Content].[PhotoLike] [PL] ON 
        [PL].[PhotoId] = [P].[PhotoId] 
        AND 
        [PL].[Archived] IS NULL
    LEFT JOIN [Content].[Comment] [C] ON 
        [C].[PhotoId] = [P].[PhotoId] 
        AND 
        [C].[Archived] IS NULL
    LEFT JOIN [Content].[FlaggedPhoto] [FP] ON 
        [FP].[PhotoId] = [P].[PhotoId] 
        AND 
        [FP].[FlaggedStatus] = 3 -- Flagged photos that are confirmed apply to everyone
WHERE
    [FP].[FlaggedPhotoId] IS NULL -- Filter out flagged photos
GROUP BY
    [P].[Key]
    , [P].[PhotoId]
    , [P].[Description]
    , [P].[FullResolutionUrl]
    , [P].[Created]
    , [UPA].[UserId]
UNION
SELECT
    [P].[Key]
    , [P].[PhotoId]
    , [P].[Description]
    , [P].[FullResolutionUrl]
    , [P].[Created]
    , [UPA].[UserId]
    , COUNT(DISTINCT [PL].[PhotoLikeId]) AS [LikeCount]
    , COUNT(DISTINCT [C].[CommentId]) AS [CommentCount]
    , CAST(ISNULL(
        MAX(CASE WHEN [PL].[UserId] = [M].[Monitor] THEN 1 END), 0) AS BIT) AS [UserLiked]
    , [M].[Monitor]
FROM [Content].[Photo] [P]
    INNER JOIN [Content].[UserPhotoAssociation] [UPA] ON 
        [UPA].[PhotoId] = [P].[PhotoId] 
        AND 
        [UPA].[ShowInSocialFeed] = 1
    INNER JOIN [User].[CurrentConnections] [M] ON 
        [M].[Monitored] = [UPA].[UserId] 
        AND 
        [M].[ShowInSocialFeed] = 1
    LEFT JOIN [Content].[PhotoLike] [PL] ON 
        [PL].[PhotoId] = [P].[PhotoId] 
        AND 
        [PL].[Archived] IS NULL
    LEFT JOIN [Content].[Comment] [C] ON 
        [C].[PhotoId] = [P].[PhotoId] 
        AND 
        [C].[Archived] IS NULL
    LEFT JOIN [Content].[FlaggedPhoto] [FP] ON 
        [FP].[PhotoId] = [P].[PhotoId] 
        AND 
        (
            [FP].[FlaggedStatus] = 3 
            OR 
            ([FP].[FlaggedBy] = [M].[Monitor] AND [FP].[FlaggedStatus] = 1)
        ) -- Flagged photos that are confirmed (3) apply to everyone
          -- , pending flags (1) apply to the user
WHERE
    [FP].[FlaggedPhotoId] IS NULL -- Filter out flagged photos
GROUP BY
    [P].[Key]
    , [P].[PhotoId]
    , [P].[Description]
    , [P].[FullResolutionUrl]
    , [P].[Created]
    , [UPA].[UserId]
    , [M].[Monitor]

এই মতামতটি ব্যবহার করে আমি আমার ক্যোয়ারীটি নীচের দিকে সংক্ষিপ্ত করে রেখেছি। নোট আমি OFFSETএকটি subquery সঙ্গে সেট করছি ।

DECLARE @UserId INT, @NumberOfItems INT, @CutoffTime DATETIME2(2);

SELECT
    [Key]
    , [PhotoId]
    , [Description]
    , [FullResolutionUrl]
    , [Created]
    , [UserId]
    , [LikeCount]
    , [CommentCount]
    , [UserLiked]
FROM  [Social].[EverFeed] [EF]
WHERE
    (
        ([EF].[UserId] = @UserId AND [EF].[Monitor] IS NULL)
        OR 
        [EF].[Monitor] = @UserId
    )
ORDER BY  -- Order here so the top works properly
    [Created] DESC
    , [Key]  -- Ensure consistant order in case of duplicate timestamps
    OFFSET CASE WHEN @CutoffTime IS NULL THEN 0 ELSE        
            (
                SELECT
                    COUNT([PhotoId])
                FROM [Social].[EverFeed] [EF]
                WHERE
                    (
                        ([EF].[UserId] = @UserId AND [EF].[Monitor] IS NULL)
                        OR 
                        [EF].[Monitor] = @UserId
                    )
                    AND
                    [EF].[Created] >= @CutoffTime -- Get the newer items
            ) END 
    ROWS FETCH NEXT @NumberOfItems ROWS ONLY

দৃশ্যটি UNIONফিল্টারিং থেকে জটিলতার আলাদাভাবে পৃথক করে । আমি মনে করি যে এই ধারাটিতে থাকা সাবকোয়ারিটি সাময়িক OFFSETসমস্যাগুলি রোধ করবে যেগুলি নিয়ে আমি পুরো প্রশ্নের তদন্ত করে পারমাণবিক তৈরি করেছিলাম।

এটি টাইপ করার সময় একটি সমস্যা আমি সবেমাত্র পেয়েছি: উপরের কোডে যদি একই সৃষ্টি তারিখের সাথে দুটি ফটো আলাদা আলাদা "পৃষ্ঠাগুলিতে" থাকে তবে পরবর্তী পৃষ্ঠাগুলির ফটোগুলি ফিল্টার আউট করা হবে। নিম্নলিখিত তথ্য বিবেচনা করুন:

PhotoId | Created | ...
------------------------
   1    | 2015-08-26 01:00.00
   2    | 2015-08-26 01:00.00
   3    | 2015-08-26 01:00.00

প্রাথমিক পৃষ্ঠায় 1 পৃষ্ঠার আকার সহ, PhotoId 1ফিরে আসবে। দ্বিতীয় পৃষ্ঠায় একই পৃষ্ঠার আকারের সাথে কোনও ফলাফল ফেরত দেওয়া হবে না। আমি মনে করি এটি সমাধান করার জন্য আমাকে Keyগাইডকে প্যারামিটার হিসাবে যুক্ত করতে হবে ....

উত্তর:


5

আমি আপনাকে এটি দিয়ে একটি অন্য পথে যেতে পরামর্শ দিই। দেখে মনে হচ্ছে এর একটি প্যাটার্ন select top() .... order byপর্যাপ্ত হওয়া উচিত।

select top(@NumberOfItems)
  P.PhotoId,
  P.[Key],
  P.Created
from Content.Photo as P
  inner join Content.UserPhotoAssociation as UPA
    on P.PhotoId = UPA.PhotoId
where
  -- Older than CutoffTime
  P.Created < @CutoffTime and
  (
  -- My photos
  UPA.UserId = @UserId or
  -- Photos by someone monitored by me
  UPA.UserID in (
                select CC.Monitored
                from [User].CurrentConnections as CC
                where CC.Monitor = @UserId
                )
  )
order by P.Created desc, P.[Key]

তৈরি করা সমান হতে পারে এমন কেসগুলি পরিচালনা করতে আপনাকে Keyকাটাফ হ্যান্ডলিংয়ের মানটি অন্তর্ভুক্ত করতে হবে । সম্ভবত একটি যেখানে এই ধরণের কিছু।

P.Created < @CutoffTime or (P.Created = @CutoffTime and P.Key > @CutoffKey)

0

প্রথমে একটি দৃশ্যে বাছাইকৃত স্টেটমেন্টকে গুণিত করুন, এরপরের সবচেয়ে সহজ চিত্রণ:

CREATE VIEW ThePhotos AS (
    SELECT
        [P].[Key]
        , [P].[PhotoId]
        , [P].[Created]
    FROM [Content].[Photo] [P]
        INNER JOIN [Content].[UserPhotoAssociation] [UPA]
        ON [UPA].[PhotoId] = [P].[PhotoId] AND [UPA].[ShowInSocialFeed] = 1
)

সম্পাদনা করুন: এবং আপনি যদি ইউএনআইএন অন্তর্ভুক্ত করতে এবং ইউজারআইডি-তে ফিল্টার করতে চান তবে পরিবর্তে একটি @ ব্যবহারকারী আইডি প্যারামিটার সহ একটি ইনলাইন টেবিল ব্যবহারকারী সংজ্ঞায়িত ফাংশনে তাদের অন্তর্ভুক্ত করুন।

দ্বিতীয়ত, (সতর্কতার সাথে) COUNT এবং নির্বাচনী বিবৃতিগুলির মধ্যে বিভেদ এড়াতে আপনার সেশনে সেট ট্রানসেকশন আইসোলেশন লেভেল স্নাপশট জাতীয় কিছু ব্যবহার করে বিবেচনা করুন। তবে আপনি সাম্প্রতিক ফটোগুলি নির্বাচন প্রতিরোধ করতে একটি নির্দিষ্ট মুহুর্তে সর্বোচ্চ ফটো আইডি ব্যবহার করতে পারেন।

তৃতীয়ত, আপনি আপনার সামনের প্রান্তে একটি অলস লোডিং প্রক্রিয়া ব্যবহার করতে পারবেন, ব্যবহারকারীরা পৃষ্ঠাটি স্ক্রোল করার সাথে সাথে পোস্টগুলি ক্রমান্বয়ে লোড করা যায় এবং (কোনওভাবে পুরানো) পেজিং সিস্টেমটি এড়ানো যায়।


বাস্তব অলস লোডিং ব্যবহার করে আপনাকে উভয় অংশ দ্বারা লোড করতে এবং তালিকার শীর্ষে সম্ভাব্য নতুন এন্ট্রি সন্নিবেশ করতে দেয়।
ব্যবহারকারী 2955677 - গ্রেগ

যদি আপনার কাটফোরের প্রয়োজন হয়, আপনি অনুরোধটি প্রসেস করার সময় আপনি সর্বোচ্চ (ফটোড) ব্যবহার করতে পারেন এবং পরবর্তী অনুরোধগুলিতে সেই মানটি ফিল্টার করতে পারেন যাতে তারা আপনার (অপ্রচলিত) ফলাফলের সাথে হস্তক্ষেপ না করে। কেবল একটি ধারণা ...
ব্যবহারকারী 2955677 - গ্রেগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.