Есть две таблицы: Ad(объявления) и AdFieldValue(дынные объявления)
Ad table:
Id int
UserId int
AdCategoryId int
Title nvarchar(255)
Description ntext
CreatedAt datetime
UpdatedAt datetime
StartedAt datetime
ExpiresAt datetime
ViewsCount int
Status tinyint
Visible bit
Vip bit
AdFieldValue table:
AdCategoryId int
AdFieldId int
AdId int
Bool bit
String nvarchar(255)
Integer int
Float float
StartedAt datetime
Задача такая:
Писк значений в таблице AdFieldValue (для нахождения AdId).
В текущем примере поиск по данным полям:
AdCategoryId = 15 AND
AdFieldId = 28 AND Integer = 72
Сортировка объявлении по дате (для это есть два варианта 1) поле StartedAt в таблице Ad или 2) дублировать StartedAt в AdFieldValue для того чтобы не делать JOIN
Прошу подсказки как сделать лучший pagination в такой ситуации с сортировкой по StartedAt
Вариант 1:
DECLARE @Skip INT = 50;
DECLARE @Take INT = 25;
SELECT TOP(@Take)
B.AdId
FROM
(
SELECT TOP(@Skip + @Take)
A.AdId,
ROW_NUMBER() OVER (ORDER BY A.Start DESC) as [RowNumber]
FROM
(
SELECT
AFV.AdId,
COUNT(AFV.AdId) AS [Count],
MAX(AFV.DateStarted) as Start
FROM
AdFieldValue AFV
WHERE
AdCategoryId = 15 AND
AdFieldId = 28 AND Integer = 72
GROUP BY
AdId
)A
WHERE A.[Count] = 1
)B
WHERE
B.RowNumber > @Skip
Вариант 2:
DECLARE @Skip INT = 50;
DECLARE @Take INT = 25;
SELECT TOP(@Take)
B.AdId
FROM
(
SELECT TOP(@Skip + @Take)
A.AdId,
ROW_NUMBER() OVER (ORDER BY Ad.StartedAt DESC) as [RowNumber]
FROM
(
SELECT
AFV.AdId,
COUNT(AFV.AdId) AS [Count]
FROM
AdFieldValue AFV
WHERE
AdCategoryId = 15 AND
AdFieldId = 28 AND Integer = 72
GROUP BY
AdId
)A
JOIN Ad ON A.AdId = Ad.Id
WHERE
A.[Count] = 1
)B
WHERE
B.RowNumber > @Skip
Вариант 3:
Если у вас есть свои предложения буду очень благодарен.
Спасибо, c Уважением Евгений.