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

..これまでのところ、「ほぼ」希望どおりに機能しています。

BUT: ユーザーには、「アクティベーション」テーブルに彼をアクティベートする複数のパートナーがいる場合があります。

これが呼び出されると、points_total の重複が得られます (uesr がパートナーによってアクティブ化された回数だけカウントされます...) これはランクリング リストではあまり意味がありません...

各 user_id に対して「1 つの」points_total のみを取得するにはどうすればよいですか

私が達成したいことを理解していただければ幸いです...どうもありがとう!

4

2 に答える 2

2

アクティベーションで結合する代わりに、user_idごとに1行のみを取得するサブセレクトを作成してから、このサブセレクトで結合するのではなく、これが機能するはずだと思います。唯一の注意点は、内部クエリ内で選択したフィールドが同じ 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

Hard to say without the full SELECT statement being shown. Most, likely you will need to remove all fields from the select that are not unique to the user_id. Having non-unique values there will give your results across multiple rows. Also it appears you should be sorting by points_total, not total.

于 2012-07-23T15:32:38.527 に答える