0

人々がテキスト メッセージを投稿する Web サイトを設計しています。ユーザーはメッセージを評価できます (1 ~ 5)。この評価を表に記録して、次のことを行います。

  1. 同じ投稿に対して 1 人のユーザーによる複数の評価を避ける
  2. 投稿の平均評価を取得できるようにします。

投票数も重要です。たとえば、3 票中 10 票の投稿 (30 票) は、5 票中 2 票の投稿 (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 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
于 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 に答える