我的头衔很可怕,但我很难绕过这个头。我有两张桌子。链接和投票。链接包含有关提交的链接和通常的爵士乐的信息,投票包含外键link_id以及karma_up和karma_down值(均为无符号整数)。因为我想限制每个用户一票并记录投票时间,所以我选择了两个表方法。我想做的是显示链接的总和业力。我需要能够抓住所有的链接然后他们的一对多票数总结为SUM(karma_up - karma_down)。我所能做的就是整理整个专栏,这对我没有任何帮助。
希望有人只是“得到”我想要做的事情,但在此之前我会尽可能多地更新这篇文章。
更新 对于任何感兴趣的人,我的最终查询是
SELECT links.*, (SUM(karma_up) - SUM(karma_down)) AS karma
FROM links, votes
WHERE links.id = votes.link_id
GROUP BY votes.link_id
答案 0 :(得分:5)
您可以发布您的架构以确定,但这样的事情应该有效
select v.link_id, (sum(karma_up) - sum(karma_down)) as points from
Links l, Votes v
where l.link_id = v.link_id group by v.link_id
那应该给你每个link_id点数。
答案 1 :(得分:2)
你需要做这样的事情:
SELECT Links.LinkId, SUM(Votes.karma_up) - SUM(Votes.karma_down) AS karma FROM Links
LEFT JOIN Votes ON Links.LinkId = Votes.LinkId
GROUP BY Links.LinkId
请注意使用LEFT JOIN以确保包含无投票的链接。
答案 2 :(得分:1)
我还想提一件事。除非允许投票同时具有上升和下降的业力(不太可能来自推荐),否则最好使用单个karma_up
列替换它们karma_down
和karma_delta
。然后将其设置为-1或1,具体取决于它是分别向下还是向上。
这样可以进一步简化您的查询:
SELECT links.*, SUM(karma_delta) AS karma
FROM links, votes
WHERE links.id = votes.link_id
GROUP BY votes.link_id
答案 3 :(得分:0)
每个链接ID的点数,如果没有投票则为零业力:
select l.*, coalesce(sub_karma, 0) as karma
from links as l
left join (
select link_id, sum(karma_up - karma_down) as sub_karma
from votes
group by link_id
) as v using (link_id)
;