PDA

Просмотр полной версии : MySQL новые записи


EvroStandart
29.06.2010, 15:17
Есть таблица с такой структурой:
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
Хм, у меня получилось несколько проще


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


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 )