2012-10-13 4 views
0

Я создаю веб-сайт, на котором люди отправляют текстовые сообщения. пользователи могут оценивать сообщения (от 1 до 5). Я записываю эти рейтинги в таблице:SQL Server: получите количество и количество столбцов

  1. избежать многократного рейтинга одного пользователя на тот же пост
  2. , чтобы иметь возможность получить средний рейтинг должности.

, но также важно также количество голосов. например, должность, имеющая 10 голосов из 3 (составляет 30), является ценной, чем должность с 2 голосами 5 (что составляет 10). Теперь, когда я показываю страницу с 20 этого сообщения, я хочу, чтобы показать их рейтинг слишком

Это моя рейтинговая таблица:

create table ratings(
[id] int primary key identity(1,1), 
[msgid] int, 
[uid] int, 
[rating] tinyint 
) 

Я хочу, чтобы добраться до 20 сообщений из таблицы сообщений с суммой рейтингов для каждого сообщения и количества оценок для каждого сообщения.

select 
    msg.id, msg.text, 
    sum(rate.rating), 
    count(rate.id) 
from 
    messages as msg 
inner join 
    ratings as rate on msg.id = rate.msgid 
group by 
    msg.id 

Может любой, пожалуйста, помогите мне с кодом запроса SQL?

+2

Покажите нам усилия, которые вы уже положили в решении этого - объяснить, где вы застряли, и мы будем рады помочь. Но мы не просто пишем код для вас .... –

+1

Я отредактировал свой вопрос и добавил код, который я пробовал –

+0

И в чем проблема с вашим кодом? Вы получаете ошибку - если да: ** какая ** ошибка? Не возвращает ли он ожидаемые данные - то, что ** ** вы ожидали? –

ответ

2

Вы не можете выбрать столбцы, которые не были использованы в group by пункте.

Try:

select 
    msg.id, msg.text, 
    sum(rate.rating), 
    count(rate.id) 
from 
    messages as msg 
inner join 
    ratings as rate on msg.id = rate.msgid 
group by 
    msg.id, msg.text 
+0

+1 ах- хороший поймать! –

0

Я думаю, что это сработает.

select msgid, 
count(msgid) MsgCount, 
     sum(rating) RatingSum 
from ratings 
where msgid = [some msgid] 
group by msgid, rating 

Это должно работать на большинстве стандартных платформ транзакций ANSI. Возможно, вам придется изменить его для вашей конкретной базы данных.

Спасибо, --James Уолш мл --Developer на Большой

+2

Добро пожаловать в StackOverflow: если вы отправляете код, XML или образцы данных, ** пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «образцы кода» ('{}') на панели инструментов редактора, чтобы красиво отформатировать и синтаксис выделить его! –

2

Вы должны координировать group by с select. Кроме того, приходится нулевой рейтинг, так что используйте левое соединение:

SELECT 
    msg.id, 
    msg.text, 
    SUM (COALESCE (rate.rating, 0)) AS ratingSum, 
    COUNT (COALESCE (rate.id, 0))  AS ratingCnt 
FROM 
    messages as msg 
LEFT JOIN 
    ratings rate ON msg.id = rate.msgid 
GROUP BY 
    msg.id, 
    msg.text 
Смежные вопросы