MSSQL Paging возвращает случайные строки, когда это тоже не предполагается - PullRequest
0 голосов
/ 06 февраля 2009

Я пытаюсь сделать некоторые основные подкачки в MSSQL. Проблема, с которой я столкнулся, заключается в том, что я сортирую страницу по строке, которая (потенциально) имеет аналогичные значения, а предложение ORDER BY возвращает «случайные» результаты, что не очень хорошо работает.

Так, например.

Если у меня есть три строки, и я сортирую их по «рейтингу», и все рейтинги равны «5» - строки, по-видимому, «случайным образом» упорядочиваются. Как мне сделать так, чтобы строки отображались в одном и том же порядке каждый раз?

Я попытался упорядочить его по дате и времени, когда поле было отредактировано в последний раз, но «рейтинг» отсортирован в обратном порядке, и опять-таки, не работает так, как я ожидаю.

Вот SQL, который я использую до сих пор. Я знаю, что это немного запутанно без данных, поэтому ... любая помощь будет очень полезна.

SELECT * FROM 
(
  SELECT 
    CAST(grg.defaultthumbid AS VARCHAR) + '_' + 
    CAST(grg.garageid AS VARCHAR) AS imagename,
    (
      SELECT COUNT(imageid) 
      FROM dbo.images im (nolock) 
      WHERE im.garageid = grg.garageid
    ) AS piccount, 
    (
      SELECT COUNT(commentid) 
      FROM dbo.comments cmt (nolock) 
      WHERE cmt.garageid = grg.garageid
    ) AS commentcount,
    grg.GarageID, mk.make, mdl.model, grg.year, 
    typ.type, usr.username, grg.content, 
    grg.rating, grg.DateEdit as DateEdit,
    ROW_NUMBER() OVER (ORDER BY Rating DESC) As RowIndex 
  FROM 
    dbo.garage grg (nolock)
    LEFT JOIN dbo.users (nolock) AS usr ON (grg.userid = usr.userid)
    LEFT JOIN dbo.make (nolock) AS mk ON (grg.makeid = mk.makeid)
    LEFT JOIN dbo.type (nolock) AS typ ON (typ.typeid = mk.typeid)
    LEFT JOIN dbo.model (nolock) AS mdl ON (grg.modelid = mdl.modelid)
  WHERE 
    typ.type = 'Automobile' AND
    grg.defaultthumbid != 0 AND
    usr.username IS NOT NULL
) As QueryResults 
WHERE 
  RowIndex BETWEEN (2 - 1) * 25 + 2 AND 2 * 25
ORDER BY 
  DateEdit DESC

Ответы [ 2 ]

3 голосов
/ 06 февраля 2009

Попробуйте сделать заказ обоими, например: Сортировать по рейтингу DESC, DateEdit ASC

1 голос
/ 06 февраля 2009

Запрос сначала нумерует строки по [Rating], а затем пересортирует результаты по [DateEdit]. Возможно, не то, что вы хотели. Заказ по [RowIndex] ASC должен разобраться.

ROW_NUMBER() OVER (ORDER BY [Rating] DESC) As [RowIndex]
...
ORDER BY [RowIndex]
...