2009-03-04 16 views
0

Bir kullanıcının sahip olduğu toplam puan miktarını ve geçerli ay puanlarını almaya çalışıyorum. Bir kullanıcı bir puan aldığında, bir zaman damgası ile puan tablosuna girer. Toplamlar zaman damgasını yok sayarken, geçerli ayın puanları doğru zaman damgasına sahip noktaları arar (ayın ilk gününden itibaren).Neden bu mysql sorgusu bana çöp sonuçları veriyor?

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 

noktaları Tablo yapısını Bu çok sayıda sonuçlanan

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; 

, eşleşen satır sayısı ile çarpılan tüm noktaların toplamı eşittir bu.

Bunu, alt sorgular veya birden fazla sorgu kullanılmadan gerçekleştirmem gerekiyor.

+0

tablo yapısını gönderebilir deneyin? – sfossen

+0

tabiki, iki kere katılıyorsunuz, bu yüzden bir kartezyen çarpım – vartec

+0

Katılmak zorunda olduğunuzu düşünmüyorum, gönderdiğim cevabı deneyin. – sfossen

cevap

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

Hâlihazırda bir noktaya ihtiyacınız var :) – Quassnoi

+0

Haklısınız: P – sfossen

+0

Gerçekten de öyle. :) –

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

Subquries kullanmadan bunu yapmam gerektiğini söylemeyi unuttum. –

+0

Neden? Bu aptalca bir kısıtlama gibi görünüyor. Sanırım onu ​​kendi kendine bir araya getirebilirsin, ama yine de. –

+0

Alt sorgularda neyin kötü olduğunu görmeyin, ancak bunları kullanamıyorsanız, kullanıcı tanımlı işlevleri kullanmanız gerekeceğinden korkuyorum. Saf ilişkisel operasyonlarla yapamazsın. – Quassnoi

İlgili konular