2010-03-17 4 views
2

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

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

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

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

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

+0

попробовав левый объединенный. использовал левый внешний – bladefist

+0

'OUTER' является избыточным. Это то же самое, что и «LEFT JOIN». – Aaronaught

+0

Все те же. –

ответ

2

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

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

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.

+0

Это сработало отлично благодаря – bladefist

+0

Хорошо, я ... Я перечитывал ваш вопрос и путался, потому что не мог найти связи между потоками и сообщениями, но я думаю вы поняли это! – Aaronaught

1

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

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

Таблица t не имеет идентификатора пользователя. UserId находится только в таблице, в которой последний раз просматривался поток. Это будет применяться в том месте, где на момент исполнения – bladefist

0

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

SELECT threads.lastpostdate, posts.dateviewed 
FROM threads 
LEFT JOIN posts 
    ON threads.id=posts.postid 
Смежные вопросы