我有一个像
这样的内容项表| contentid | message | categoryid | userid | dateadded | etc..
15 foo bar 3 4 somedate
16 more foo bar 3 4 somedate
16 foo stuff 3 4 somedate
和投票表,其中direction = 1 =向上投票,= 2是向下投票。
| voteid | contentid | userid | direction | dateadded
7 15 4 1 some date
8 15 6 1 some date
9 15 17 2 some date
我想选择一组内容项目,最后根据投票表中的投票计算得分。“/ p>
之前,我在内容表中附加了一个“得分”列,每次投票时,都会更新其得分。这样做了所以我不需要有更复杂的查询来计算每个SELECT的分数,但我现在想改变它。
此投票表是前一段时间设计的,所以如果将所有投票值更改为1或2以外的值(对于downvote可能为-1)会使其更容易,我将更新整个表格。
查询将拉出所有内容项目,每个内容项目都有一个计算列中的分数?
答案 0 :(得分:2)
假设投票“方向”代表上下投票:
SELECT i.contentid,
SUM(CASE WHEN v.direction = 1 THEN 1
WHEN v.direction = 2 THEN -1
ELSE 0 END) AS Votes
FROM items i
LEFT JOIN votes v
ON i.contentid = v.contentid
GROUP BY i.contentid
HAVING SUM(CASE WHEN v.direction = 1 THEN 1
WHEN v.direction = 2 THEN -1
ELSE 0 END) > -3
答案 1 :(得分:0)
SELECT
items.*,
SUM(direction = 1) - SUM(direction = 2) AS score
FROM items
LEFT JOIN votes USING (contentid)
GROUP BY contentid
这可行的原因是因为真正的比较评估为1
而虚假评估评估为0
。