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 的重复(它将被计算多次,因为 uesr 已被合作伙伴激活......)这在排名列表中没有多大意义......

我怎样才能为每个 user_id 只获得“一个”points_total

希望你明白,我想要实现什么......非常感谢!

4

2 回答 2

2

我认为这应该可以工作,而不是通过激活加入一个子选择,每个 user_id 你只会得到一行然后加入这个子选择,我不确定这是否是 MySql sintax,但它应该向你展示方式。唯一要注意的是,您在内部查询中选择的字段对于相同的 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
于 2012-07-23T15:47:32.900 回答
0

如果不显示完整的 SELECT 语句,很难说。大多数情况下,您可能需要从 select 中删除所有非 user_id 唯一的字段。那里有非唯一的值会给你的结果跨多行。此外,您似乎应该按 points_total 排序,而不是按总数排序。

于 2012-07-23T15:32:38.527 回答