从一个表中选择并包含另一个的总和值

时间:2009-11-21 23:41:27

标签: php mysql

我的头衔很可怕,但我很难绕过这个头。我有两张桌子。链接和投票。链接包含有关提交的链接和通常的爵士乐的信息,投票包含外键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

4 个答案:

答案 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_downkarma_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)
;