2009-03-04 12 views
0

現在の月のポイントだけでなく、ユーザーの合計ポイント数を取得しようとしています。ユーザーがポイントを取得すると、タイムスタンプでポイントテーブルに記録されます。合計はタイムスタンプを無視し、現在の月のポイントは正しいタイムスタンプのポイントを探します(その月の最初の日から)。これは非常に多数になるこのmysqlクエリはなぜ私にガベージ結果を与えるのですか?

SELECT user_id, user_name, sum(tpoints.point_points) as total_points, sum(mpoints.point_points) as month_points 
FROM users 
LEFT JOIN points tpoints 
ON users.user_id = tpoints.point_userid 
LEFT JOIN points mpoints 
ON (users.user_id = mpoints.point_userid AND mpoints.point_date > '$this_month') 
WHERE user_id = 1 
GROUP BY user_id 

ポイントテーブル構造

CREATE TABLE IF NOT EXISTS `points` (
    `point_userid` int(11) NOT NULL, 
    `point_points` int(11) NOT NULL, 
    `point_date` int(11) NOT NULL, 
    KEY `point_userid` (`point_userid`), 
    KEY `point_date` (`point_date`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

は、クエリに一致する行の数を乗じた全てのポイントの合計に等しい厥。

サブクエリまたは複数のクエリを使用せずにこれを達成する必要があります。

+0

を試してみてください? – sfossen

+0

もちろん、あなたは2回参加しているので、デカルト乗算です – vartec

+0

私はあなたがまったく参加する必要はないと思いますが、私が投稿した答えを試してみてください。 – sfossen

答えて

6

を使用すると、テーブル構造を投稿することができます

SELECT user_id, user_name, sum(point_points) as total_points, sum(case when point_date > '$this_month' then point_points else 0 end) as month_points 
FROM users 
    LEFT JOIN points 
     ON users.user_id = points.point_userid 
WHERE user_id = 1 
GROUP BY user_id, user_name 
+0

あなたはまだここにポイントとの結合が必要です:) – Quassnoi

+0

あなたは正しいです:P – sfossen

+0

確かに彼です。 :) –

1
SELECT user_id, user_name, 
     (
     SELECT SUM(points.point_points) 
     FROM points 
     WHERE points.point_userid = users.user_id 
     ) AS total_points, 
     (
     SELECT SUM(points.point_points) 
     FROM points 
     WHERE points.point_userid = users.user_id 
       AND points.point_date > '$this_month' 
     ) AS month_points 
FROM users 
WHERE user_id = 1 
+0

サブクールを使わずにこれを行う必要があることを忘れてしまった。 –

+0

なぜですか?それはばかげた制約のようです。私はあなたがそれを自己結合に変えることができると思う。 –

+0

サブクエリで何が悪いのか分かりませんが、使用できない場合は、ユーザ定義の関数を使用する必要があります。純粋な関係演算ではできません。 – Quassnoi

関連する問題