Помогите с SQL Join на две таблицы - PullRequest
2 голосов
/ 17 марта 2010

У меня есть две таблицы, одна из них - таблица тем форума. У него есть последний столбец с датой публикации.

Другая таблица имеет PostID, UserId и DateViewed.

Я хочу объединить эти таблицы, чтобы я мог сравнить DateViewed и LastPostDate для текущего пользователя. Однако, если они никогда не просматривали поток, во 2-й таблице не будет строки.

Это кажется легким, но я не могу обернуть голову вокруг этого. Совет пожалуйста.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 17 марта 2010

Что конкретно вы пытаетесь сделать - определить, есть ли непрочитанные сообщения?

Вам просто нужно использовать внешнее соединение:

SELECT p.PostID, p.LastPostDate, ...,
    CASE
        WHEN v.DateViewed IS NULL OR v.DateViewed < p.LastPostDate THEN 1
        ELSE 0
    END AS Unread
FROM Posts p
LEFT JOIN PostViews v
    ON v.PostID = p.PostID
    AND v.UserID = @UserID

Обратите внимание, что я поместил тест UserID в состояние JOIN; если вы введете его в предикат WHERE, вы не получите результатов, потому что в таблице PostViews не будет соответствующих строк.

1 голос
/ 17 марта 2010

Итак, вы думаете что-то вроде:

SELECT t.UserID, t.PostID, t.LastPostDate, v.DateViewed
FROM dbo.Threads t
LEFT JOIN dbo.Views v ON v.PostID = t.PostID
                     AND v.UserID = t.UserID
WHERE t.UserID = @user;

v.DateViewed будет иметь значение NULL, если в Views нет соответствующей строки.

Если у вас есть много строк в представлениях, вы можете сделать что-то вроде:

SELECT t.UserID, t.PostID, t.LastPostDate, v.DateViewed
FROM dbo.Threads t
CROSS APPLY (SELECT MAX(vw.DateViewed) as DateViewed 
             FROM dbo.Views vw
             WHERE vw.PostID = t.PostID
               AND vw.UserID = t.UserID
            ) v
WHERE t.UserID = @user;
0 голосов
/ 17 марта 2010

Ключ должен использовать LEFT JOIN, что приведет к тому, что несуществующие строки справа будут отображаться как все NULL:

SELECT threads.lastpostdate, posts.dateviewed
FROM threads
LEFT JOIN posts
  ON threads.id=posts.postid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...