2009-03-04 16 views
0

Ich versuche, die Gesamtanzahl der Punkte, die ein Benutzer hat, sowie die aktuellen Monatspunkte zu erhalten. Wenn ein Benutzer einen Punkt erhält, wird er mit einem Zeitstempel in die Punktentabelle eingeloggt. Die Summen ignorieren den Zeitstempel, während die Punkte des aktuellen Monats nach den Punkten mit dem korrekten Zeitstempel (vom ersten Tag des Monats) suchen.Warum gibt diese mysql-Abfrage Müll Ergebnisse?

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 

Punkte Tabellenstruktur

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; 

Dies in einer sehr großen Zahl ergibt, das ist die Summe aller Punkte gleich, durch die Anzahl der Zeilen multipliziert, die der Abfrage entsprechen.

Ich muss dies ohne die Verwendung von Unterabfragen oder mehrere Abfragen erreichen.

+0

können Sie die Tabellenstruktur hinterlassen? – sfossen

+0

natürlich, du machst doppelt beitreten, also ist es eine kartesische Multiplikation – vartec

+0

Ich glaube nicht, dass Sie überhaupt beitreten müssen, versuchen Sie die Antwort, die ich gepostet habe. – sfossen

Antwort

6

versuchen

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

Sie brauchen noch einen Beitritt mit Punkten hier :) – Quassnoi

+0

Sie haben Recht: P – sfossen

+0

In der Tat ist er. :) –

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

Vergessen zu erwähnen, dass ich dies ohne die Verwendung von Subquiries tun muss. –

+0

Warum? Das scheint ein dummer Zwang zu sein. Ich nehme an, Sie könnten es in einen Self-Join konvertieren, aber trotzdem. –

+0

Sehen Sie nicht, was in Unterabfragen schlecht ist, aber wenn Sie sie nicht verwenden können, dann müssen Sie leider benutzerdefinierte Funktionen verwenden. Sie können es nicht mit reinen relationalen Operationen tun. – Quassnoi

Verwandte Themen