0

我正在设计一个人们发布短信的网站。用户可以对消息进行评分(1 到 5)。我将此评级记录到表格中以:

  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查询代码吗?

4

3 回答 3

2

您不能选择未在group by子句中使用的列。

尝试:

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
于 2012-10-13T15:11:43.583 回答
2

您需要group byselect. 另外,考虑零评级,所以使用左连接:

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
于 2012-10-13T15:16:56.183 回答
0

我认为这会奏效。

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

这应该适用于大多数 ANSI 标准事务 sql 平台。您可能必须针对您的特定数据库对其进行修改。

谢谢,--James Walsh Jr.--开发者

于 2012-10-13T15:00:09.323 回答