Почему этот запрос MySQL дает мне результаты мусора? - PullRequest
0 голосов
/ 04 марта 2009

Я пытаюсь получить общее количество баллов у пользователя, а также баллы за текущий месяц. Когда пользователь получает точку, он регистрируется в таблице точек с отметкой времени. Итоги игнорируют временную метку, а точки текущего месяца ищут точки с правильной временной меткой (с первого дня месяца).

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;

В результате получается очень большое число, равное сумме всех точек, умноженной на количество строк, соответствующих запросу.

Мне нужно добиться этого без использования подзапросов или нескольких запросов.

Ответы [ 2 ]

6 голосов
/ 04 марта 2009

1001 * попробовать *

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
1 голос
/ 04 марта 2009
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...