MySQL语句(Group和SUM() => 每行获取多个“sum”结果)

3

我有几个表格:

table user:
id  firstname   lastname
1   John      Doe
2   Jane      Skith
3   will      Smith
...

table member:
member_id    member_user_id member_status member_activated_by
10         1              yes           partner 1
11         1              yes           partner 2
12         1              yes           partner 3
13         2              yes           partner 2
14         3              no            ----
...

table points:
points_id    points_user_id points_value points_date
10         1              10           2012-02-15 
11         2              15           2012-02-15 
12         2              20           2012-02-15 
13         1              5            2012-02-15 
14         3              30           2012-02-15 
15         1              12           2012-02-15 
...

So results SHOULD be:
 id1 - John Doe:   27 Points
 id2 - Jane Skith: 35 Points
 id3 - will Smith: nothing (not activated)

问题是,id1带来了81分(因为他已经被激活了3次...)。
这是我当前的mysql字符串(缩短了...) 。
SELECT points_user_id, SUM( points_value ) AS points_total, id, firstname, lastname
FROM user
JOIN member ON member.member_user_id = user.id
JOIN points ON points.points_user_id = user.id
WHERE 1
AND member_status = 'yes'
GROUP BY points_user_id
ORDER BY points_total DESC 
LIMIT 0 , 100

到目前为止,它“几乎”按预期工作。

但是:一个用户可能有多个合作伙伴将他激活进入“激活”表中。

现在当调用此功能时,我会得到points_total的重复计数(它将被计算多次,就像用户已经被合作伙伴激活了一样...)这对于排名列表来说并没有太多意义...

我该如何为每个user_id仅获得“一个” points_total

希望您理解我想要实现的内容...非常感谢!


请您能否澄清一下表格?您将“activation”列为一个表格,但在查询中却没有它。相反,“member”表格在查询中,但您的表格中却没有列出它。最后,请明确指出查询中哪个字段属于哪个表格。 - Dancrumb
抱歉,这里有太多的复制粘贴内容了。现在所有的信息都应该在问题中了。 - Christian K.
2个回答

2

我认为这应该有效,而不是使用带有激活函数的连接(join),可以使用子查询来获取每个用户(user_id)仅一行数据,然后使用该子查询进行连接(join)。我不确定这是否是MySql语法,但它应该指引您正确的方向。唯一的注意事项是,在内部查询中选择的字段可能不会随着同一个用户(user_id)而变化。

SELECT user_id, SUM( point_row ) AS points_total, user_data...,...
    FROM points
    JOIN user_data AS UD
    ON UD.user_id = points.user_id

JOIN ( SELECT field1,field2,field3, MAX(activation.user_id) as user_id 
  FROM activation WHERE activation_info = 'yes'
  GROUP BY field1,field2,field3 AS ACTIV )  AS ACTIV
  ON user_data.user_id = AS ACTIV.user_id

WHERE points.points_status = '1'
AND   ACTIV.activation_info = 'yes'
GROUP BY points.user_id
ORDER BY total DESC 
LIMIT 0 , 100

嗨,维克多,谢谢!你的答案给了我前进的方向 - 现在一切都很好。 - Christian K.

0
很难在没有完整的SELECT语句的情况下进行判断。最有可能的是,您需要从选择中删除所有不唯一于user_id的字段。在那里具有非唯一值将使您的结果跨越多行。此外,似乎您应该按points_total而不是total进行排序。

这是正在使用的Select语句: SELECT points_user_id, SUM( points_value ) AS points_total, id, firstname, lastname FROM user JOIN member ON member.member_user_id = user.id JOIN points ON points.points_user_id = user.id WHERE 1 AND member_status = 'yes' GROUP BY points_user_id ORDER BY points_total DESC LIMIT 0 , 100 - Christian K.
那么每个字段来自哪些表呢?在跨表连接时使用表引用或表别名是一个好的实践(这使得你的查询对于可能需要阅读它的外部方更加易懂)。另外,如果points_user_id和id相等(从你的连接中看起来是这样),为什么在select语句中会出现两次呢? - Mike Brant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接