【问题标题】:Optimally querying a database of ratings?优化查询评级数据库?
【发布时间】:2009-07-06 14:15:24
【问题描述】:

我有一个评级表,其中存储了用户 ID、对象 ID 和分数(+1 或 -1)。现在,当我想显示对象列表及其总分、+1 票数和 -1 票数时。

我怎样才能有效地做到这一点而不必执行 SELECT COUNT(*) FROM rating WHERE (score = +/-1 AND object_id = ..)?每个显示的对象有两个查询,这是不可接受的。数据库设计合理吗?

【问题讨论】:

  • 为了判断设计,我们需要对设计提出一些要求。对于手头的简单任务,设计很好,因为有一个简单的解决方案。

标签: sql database database-design


【解决方案1】:

虽然它没有解决您的合理设计问题,但这里有一个查询可以让您同时考虑:

select
    sum(case when score = 1 then 1 else 0 end) 'positive'
,   sum(case when score = -1 then 1 else 0 end) 'negative'
,   objectId
from
    ratings
where
    objectId = @objectId ...
group by
    objectId

【讨论】:

    【解决方案2】:

    应该这样做:

    SELECT
        UserID, ObjectID,
        SUM(CASE WHEN score=1 Then 1 Else 0 End) as UpVotes,
        SUM(CASE WHEN score=-1 Then 1 Else 0 End) as DownVotes,
    FROM YourTable
    GROUP BY UserID, ObjectID
    

    【讨论】:

      【解决方案3】:
      select object_id, 
             sum(case when score = 1 then 1 else 0) upvotes, 
             sum(case when score = -1 then -1 else 0) downvotes,
             sum(score)
      from ratings
      group by object_id 
      

      也许是这样的。

      【讨论】:

      • (选择中也需要object_id。)
      • (为什么会这样。谢谢,好心的先生。这已被编辑。这个问题的正确答案第一次就正确了,如果我没记错的话,比我快 48 秒。)
      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 2019-03-30
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多