MySQL « HAVING max(date) работает не корректно

Есть запрос
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .sql.geshi_code {font-family:monospace;} .sql.geshi_code .imp {font-weight: bold; color: red;} .sql.geshi_code .kw1 {color: #993333; font-weight: bold;} .sql.geshi_code .co1 {color: #808080; font-style: italic;} .sql.geshi_code .co2 {color: #808080; font-style: italic;} .sql.geshi_code .coMULTI {color: #808080; font-style: italic;} .sql.geshi_code .es0 {color: #000099; font-weight: bold;} .sql.geshi_code .br0 {color: #66cc66;} .sql.geshi_code .sy0 {color: #66cc66;} .sql.geshi_code .st0 {color: #ff0000;} .sql.geshi_code .nu0 {color: #cc66cc;} .sql.geshi_code span.xtra { display:block; }

SELECT  * FROM `Users` LEFT JOIN Events USING(user_id) GROUP BY user_id HAVING max(Events.time)
 


Который должен возвращать список юзеров с последним их событием.
Тип поля Events.time - timestamp
Однако время последнее событие для юзера отображается как 2012-12-20 15:07:31 в то время как реальная дата последнего события 2012-12-28 11:27:41
В чем можно быть причина некорректной работы этого запроса?

1 ответов


Во-первых, having это условие как и where, только применяется после группировки. Главное - там должно быть корректное условие.
Во-вторых, с этим типом запросов все несколько сложнее. Сначала надо определить, какое время события для каждого юзера максимальное (последнее). Затем из таблицы событий выбрать записи, соответствующие максимальному времени события. И только теперь можно соединять с юзерами.


SELECT  * FROM `Users`
LEFT JOIN
(
  select * from Events
  JOIN
  (
    select user_id, max(time) as time
    from Events
    group by user_id
  ) max_time
 USING (user_id, time)
) ev
USING(user_id);
 


SELECT `Users`.* FROM `Events` RIGHT JOIN `Users` USING(`user_id`) GROUP BY `user_id` HAVING  (`Events`.`time` = MAX(`Events`.`time`))