Как группировать записи на основе условия в MySQL (group_by) - PullRequest
1 голос
/ 11 августа 2011

У меня есть таблица пользователей, у каждого пользователя есть несколько записей.Мне нужно получить последние вставленные записи каждого пользователя.Как это возможно, используя MySQL

таблица пользователей

id      name   value    updated_at

1       abc    123      2011-02-03
2       xyz    qwe      2011-04-03
3       abc    asd      2011-08-08
4       xyz    poi      2011-08-07

Мой вывод должен быть

id      name   value    updated_at

3       abc    asd      2011-08-08
4       xyz    poi      2011-08-07

Я использовал запросы типа

 select id,name,value,updated_at  from users group by name having max(updated_at)

 select id,ep_name,position,max(updated_at)  from test1 group by ep_name having max(updated_at)

НоЯ не смог получить желаемый результат.Я получаю значение max (updated_at), но не могу получить соответствующую строку.Пожалуйста, помогите

Примечание: это можно сделать без использования подзапроса.Пожалуйста, помогите

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 11 августа 2011
SELECT
  users.id,users.name, users.`value`, users.`updated_at`
FROM
  users
INNER JOIN
(
 SELECT name, MAX(updated_at) AS `updated_at`
 FROM
  users
 GROUP BY
  name
) max_users
ON
  users.name = max_users.name
AND
  users.updated_at = max_users.updated_at

Дан большое спасибо ... :) небольшое изменение в группе, чтобы соответствовать моему выводу

1 голос
/ 11 августа 2011

Нет, это не может быть сделано без подзапроса. Подзапрос является частью одного запроса.

SELECT
  users.*
FROM
  users
INNER JOIN
  (
    SELECT
      id,
      MAX(updated_at) AS `updated_at`
    FROM
      users
    GROUP BY
      id
  ) max_users
ON
  users.id = max_users.id
AND
  users.updated_at = max_users.updated_at
0 голосов
/ 11 августа 2011

Вы правы, мистер Амаль, вы не получите ответ, который вы указали выше. Запрос Дэна вернется со всеми результатами.

Попробуйте это определенно вы будете на своем пути

SELECT  test.* FROM  test INNER JOIN (SELECT MAX(updated_at) AS `updated_at` FROM test GROUP BY  name) max_users
ON
  test.updated_at = max_users.updated_at

Второй вариант для вас:

SELECT  * FROM  test WHERE updated_at IN(SELECT MAX(updated_at) FROM test GROUP BY  name)

что намного проще первого

...