Лучше SQL, чтобы тянуть темы и сообщения? - PullRequest
0 голосов
/ 25 августа 2011

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

У меня есть одна таблица сообщений, которая выглядит следующим образом:

ID int [PK]
ThreadId nvarchar(32)
Read bit
Archived bit
Timestamp datetime
/*---Other non-relevant columns---*/
Sender_MemberId int [FK]
Receiver_MemberId int [FK]

Как и в Gmail, я хочу иметь возможность извлекать все потоки и все сообщения этого потока на основе обычного использования сообщений (входящие, отправленные, заархивированные и т. Д.).

Вот SQL, который я сейчас использую для входящих сообщений:

SELECT * FROM [Messages]
WHERE [ThreadId] IN 
(
    SELECT [ThreadId]
    FROM [Messages]
    WHERE ([Receiver_MemberId] = @MemberId)
)
ORDER BY [ThreadId] DESC, [Timestamp] DESC

Это работает, как я хочу, но есть ли лучший способ сделать это?Или, если нет, что я должен иметь индексы?

ОБНОВЛЕНИЕ: В соответствии с хорошим предложением Аарона, я добавил подкачку и сократил объем информации, которую извлекаю сразу.

Новый SQL:

SELECT DISTINCT m.[ThreadId], m.[Subject], m.[To], m.[From], m.[Timestamp]
FROM 
(   
    SELECT ROW_NUMBER() OVER (ORDER BY MessageId) AS RowNumber , ThreadId
    FROM [Messages]
    WHERE [Sender_MemberId] = @p1
) 
AS t
INNER JOIN [Messages] m ON m.ThreadId = t.ThreadId
WHERE t.RowNumber BETWEEN @Skip + 1 AND @Skip + @Take
ORDER BY [Timestamp] DESC

1 Ответ

1 голос
/ 25 августа 2011

Вам не нужен подзапрос, это должно сделать

  SELECT Id
       , [ThreadId]
       , read
       , archived
       , timestamp
  FROM   [Messages]
  WHERE  [Receiver_MemberId] = @MemberId
  ORDER BY [ThreadId] DESC, [Timestamp] DESC

Рекомендуется называть столбцы, которые вам нужны, а не использовать *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...