2009-03-04 23 views
0

En essayant d'obtenir le nombre total de points qu'un utilisateur a, ainsi que les points du mois en cours. Lorsqu'un utilisateur obtient un point, il est connecté à la table de points avec un horodatage. Les totaux ignorent l'horodatage, tandis que les points du mois en cours recherchent les points ayant l'horodatage correct (à partir du premier jour du mois).Pourquoi cette requête mysql me donne-t-elle des résultats erronés?

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 
la structure de table de points

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; 

Il en résulte un très grand nombre, thats égal à la somme de tous les points, multiplié par le nombre de lignes correspondant à la requête.

Je dois y parvenir sans l'utilisation de sous-requêtes ou de requêtes multiples.

+0

peut vous envoyer la structure de la table? – sfossen

+0

bien sûr, vous faites deux fois, donc c'est une multiplication cartésienne – vartec

+0

Je ne pense pas que vous ayez besoin de vous joindre du tout, essayez la réponse que j'ai posté. – sfossen

Répondre

6

essayer

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

Vous avez encore besoin d'une jointure avec des points ici :) – Quassnoi

+0

vous avez raison: P – sfossen

+0

En effet, il est. :) –

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

Oublié de mentionner que je dois le faire sans l'utilisation de sous-requêtes. –

+0

Pourquoi? Cela semble être une contrainte idiote. Je suppose que vous pourriez le convertir en une auto-adhésion, mais quand même. –

+0

Ne voyez pas ce qui est mauvais dans les sous-requêtes, mais si vous ne pouvez pas les utiliser, alors je crains que vous deviez utiliser des fonctions définies par l'utilisateur. Vous ne pouvez pas le faire avec de simples opérations relationnelles. – Quassnoi

Questions connexes