2010-12-09 5 views
0

У меня есть таблицы сообщений в блогах - каждый пост получил оценку. Пользователи могут голосовать на почте, которая будет либо увеличивать, либо уменьшать счет.SQL Server Предложение WHERE, когда дубликаты

Я только хочу, чтобы пользователи могли голосовать один раз за сообщение, поэтому у меня есть таблица голосов с userId и postId. Когда пользователь пытается проголосовать, он сначала проверяет, проголосовали ли они. Они не могут голосовать снова, но они могут «отменить» или отменить свой голос. Аналогично SO.

Теперь, когда все работает нормально, однако, когда страница отображается, я хочу показать пользователям, на какие должности они проголосовали. Например, SO показывает вам свои голоса.

Я выбираю столбики из таблицы сообщений и оставляю внешнее соединение в таблице голосов, поэтому я могу проверить, проголосовал ли пользователь.

SELECT * FROM ( 
    SELECT row_number() over (ORDER BY CreationDate DESC) AS rn, * 
    FROM (
    SELECT p.id, ownerUserId, p.CreationDate, COUNT(p.id) over (partition BY NULL) AS totalRecordCount, v.voteType 
     FROM Posts p 
    LEFT OUTER JOIN Votes v on p.id = v.postId 
    ) x 
) y 
WHERE 
rn BETWEEN 1 AND 20 

Это теперь дает мне сообщения, но они содержат повторяющиеся записи для каждого голосования. Я не могу этого сделать, потому что это разбивает мою разбивку на страницы.

Я попытался добавить:

WHERE (v.userId = 1234 OR v.userId IS NULL) 

, который на самом деле не работает, потому что очевидно, что это не будет показывать запись о том, что текущий пользователь не голосовали, а кто-то другой.

Знаете ли вы, как я могу это достичь? Можно ли это сделать в одном запросе?

EDIT:

Этот запрос является урезанной версией. В основном запрос возвращает сообщения. Вот и все. Затем я показываю voteUpButton и voteDownButton на странице, которую пользователи используют для голосования. Я хочу проверить, проголосовал ли пользователь за сообщение и продемонстрировал, что голосование заставило кнопку больше.

Так где я показываю кнопку, я хочу сделать что-то вроде:

if (session.userObj.isLoggedIn() && len(postBoObj.get("voteType")) && postBoObj.get("voteType") == upVote) { 
    //show big up button 
else 
    //show normal up button 

voteType хранятся в таблице голосов, поэтому, когда я присоединился к сообщению таблицы и голоса таблицы, и добавил мой «ГДЕ (v.userId = 1234 ИЛИ v.userId IS NULL) «Я мог предположить, что если бы существовал тип голосования, тогда на этом посту проголосовал текущий зарегистрированный пользователь. Но, как я уже упоминал, будут отображаться только сообщения, на которые голосовал пользователь, или никто не голосовал. Если есть сообщение, которое проголосовал другой пользователь, тогда «WHERE (v.userId = 1234 ИЛИ v.userId IS NULL)» исключит его, и сообщение никогда не будет видно.

Надеюсь, я сам себя объяснил. Я в основном хочу, что делает Stackoverflow. Когда я нажимаю на вопрос, я вижу любые голоса, которые я сделал. Когда Joe Blogs выходит на тот же вопрос, он видит свои голоса.

+0

Можете ли вы показать некоторый пример вывода, а затем пример того, как вы хотели бы, чтобы она появилась – 2010-12-09 11:37:06

+0

?? voteTable = Голоса – msi77 2010-12-09 11:38:36

ответ

1

Move, что дополнительное условие в ваш JOIN:

SELECT * FROM ( 
    SELECT row_number() over (ORDER BY CreationDate DESC) AS rn, * 
    FROM (
    SELECT p.id, ownerUserId, p.CreationDate, COUNT(p.id) over (partition BY NULL) AS totalRecordCount, v.voteType 
     FROM Posts p 
    LEFT OUTER JOIN Votes v on p.id = v.postId AND v.UserID = 1234 /* <-- New bit here */ 
    ) x 
) y 
WHERE 
rn BETWEEN 1 AND 20 
Смежные вопросы