IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   MySQL новые записи (http://www.imho.ws/showthread.php?t=144057)

EvroStandart 29.06.2010 15:17

MySQL новые записи
 
Есть таблица с такой структурой:
id
user_id
amount
insert_date

Данные примерно такие:
1 / 1 / 15 / 2010-04-13 12:05:11
2 / 1 / -2 / 2010-04-22 09:00:49
3 / 1 / -1 / 2010-04-22 09:01:17
4 / 2 / 8 / 2010-04-22 09:06:45
5 / 2 / -1 / 2010-04-22 09:10:41
6 / 2 / -1 / 2010-04-22 09:12:37
7 / 2 / -1 / 2010-04-22 09:12:42
8 / 1 / 10 / 2010-06-09 00:00:00
9 / 1 / -2 / 2010-06-09 12:59:00
10 / 3 / 5 / 2010-06-09 13:27:45

Нужна выборка по user_id. Чтобы для каждого user_id получить последнюю запись где количество больше нуля.

Результат должен получиться такой:
8 / 1 / 10 / 2010-06-09 00:00:00
4 / 2 / 8 / 2010-04-22 09:06:45
10 / 3 / 5 / 2010-06-09 13:27:45

У меня получился такой запрос:
Код:

SELECT u.id, u.amount, u.user_id, u.insert_date, u3.user_id AS user_id2, u3.insert_date AS insert_date2
FROM users_konto AS u
INNER JOIN ( SELECT u.id, u.user_id, u.amount, MAX( u2.insert_date ) AS  insert_date
  FROM users_konto u
  LEFT JOIN ( SELECT id, user_id, amount, insert_date
      FROM users_konto WHERE amount >0 ) AS u2 ON u.id = u2.id
      GROUP BY u.user_id
      HAVING u.amount >0 ) AS u3 ON u3.user_id=u.user_id AND u3.insert_date=u.insert_date
WHERE u.amount >0

Мне это решение не очень нравится. Чтобы проблем не возникло, туда нужно уникальный ключ делать на user_id + insert_date.

Более красивые варианты есть?

Hubbitus 04.07.2010 23:42

Хм, у меня получилось несколько проще:
Код:

SELECT *
FROM
        users_konto u
        INNER JOIN (
                SELECT u1.user_id, AMX(u1.insert_date)
                FROM users_konto u1
                WHERE u1.amount > 0
                GROUP BY user_id
                ) u2 ON (u.user_id = u2.user_id and u.insert_date = u2.insert_date)

Писал "на вскидку", то есть не проверял, чисто по посту, но вроде должно работать, и если правильно понял, то именно как надо. Если очень надо, скажите (а лучше дайте этот SQL дамп для теста) - проверю.

EvroStandart 08.07.2010 13:14

Цитата:

Сообщение от Hubbitus (Сообщение 1715454)
Хм, у меня получилось несколько проще

Спасибо. Так получше выглядит :)

Код:

SELECT *
FROM users_konto u
INNER JOIN (
  SELECT u1.user_id, MAX( u1.insert_date ) AS insert_date
  FROM users_konto u1
  WHERE u1.amount >0
  GROUP BY user_id
)u2 ON ( u.user_id = u2.user_id
AND u.insert_date = u2.insert_date )



Часовой пояс GMT +4, время: 07:37.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.