SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.08.2009 12:22:11

skeef
Участник
Зарегистрирован: 29.01.2009
Сообщений: 17

Как выбрать последнее значение?

Приветствую уважаемых гуру!

Есть таблица:
CREATE TABLE `history_code` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `code` varchar(4) NOT NULL,
  `date` date NOT NULL,
  PRIMARY KEY (`id`)
);

Таблица, к примеру, запонена так:
INSERT INTO `history_code`
(`id`, `user_id`, `code`, `date`) VALUES
(1,       28001,     '002',    '2009-08-19'),
(2,       28001,     '017',    '2009-08-20'),
(3,       28001,     '013',    '2008-08-21'),

(4,       28002,     '017',    '2009-08-17'),
(5,       28002,     '002',    '2009-08-18'),
(6,       28002,     '006',    '2009-08-19'),

(7,       28003,     '015',    '2009-08-10'),
(8,       28003,     '001',    '2009-08-11'),
(9,       28003,     '012',    '2009-08-12')

Смысл в двух словах: Каждому пользователю присваивают какой-то код, при этом сохраняется дата.
Для простоты в примере 3 пользователя и даты различаются на 1 день, что в реальности конечно же не так smile

Вопрос:
Как мне составить запрос, чтобы выбрать всех пользователей с последним кодом, учитывая, что даты присвоения везде различны?
Мускул 5-й.
Планируется использовать в качестве подзапроса

Поиски и гуглы результатов не дали ...
Заранее благодарен

Отредактированно skeef (22.08.2009 12:32:57)

Неактивен

 

#2 22.08.2009 16:26:31

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Как выбрать последнее значение?

Боюсь, что и эта штука будет с подзапросом:

SELECT user_id
FROM history_code
WHERE code = (SELECT MAX(code) FROM history_code);

Ключик на (code) не забудьте добавить.

Неактивен

 

#3 22.08.2009 16:57:55

skeef
Участник
Зарегистрирован: 29.01.2009
Сообщений: 17

Re: Как выбрать последнее значение?

Не совсем так.

SELECT a.user_id, a.code
FROM history_code AS a
WHERE a.date = (SELECT MAX(b.date) FROM history_code AS b WHERE a.user_id=b.user_id );

Как-то так, но бредятина какая-то получается.

Сори, я, видимо, не верно объяснил: Мне нужно в итоге получить

| id | user_id | code | date
-----------------------------------
| 3  | 28001   | 013  | 2008-08-21
| 6  | 28002   | 006  | 2009-08-19
| 9  | 28003   | 012  | 2009-08-12

т.е. выбрать последний код (по дате) для каждого пользователя

Неактивен

 

#4 22.08.2009 17:02:10

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Как выбрать последнее значение?

SELECT user_id, MAX(code)
FROM history_code
GROUP BY 1;

Оно? Или id и дата тоже нужны? Если нужны, то попробуйте с объединением:

SELECT *
FROM history_code a
JOIN (SELECT user_id, MAX(code) code FROM history_code GROUP BY 1) b ON (a.code = b.code AND a.user_id = b.user_id);

Неактивен

 

#5 23.08.2009 10:27:36

skeef
Участник
Зарегистрирован: 29.01.2009
Сообщений: 17

Re: Как выбрать последнее значение?

Невероятно долго работает. Пришлось пересмотреть структуру базы для текущей задачи. Три подзапроса крутовато будет.

Что же касается данной таблицы историй, то видимо будет правильно создать поле-флаг и при вводе данных устанавливать в нем 1, что будет означать последняя запись, и сбрасывать флаг у предыдущей.
Благодарю тех кто откликнулся.

Неактивен

 

#6 24.08.2009 13:09:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Как выбрать последнее значение?

У Вас наверняка не хватает индексов, поэтому работает медленно. Но, конечно,
хорошая денормализация работает быстрее. С другой стороны — флаг — очень
неэкономное решение. Я бы сделал отдельную табличку с нужными id, если уж
денормализовывать.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson