![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Приветствую уважаемых гуру!
Есть таблица:
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 день, что в реальности конечно же не так
Вопрос:
Как мне составить запрос, чтобы выбрать всех пользователей с последним кодом, учитывая, что даты присвоения везде различны?
Мускул 5-й.
Планируется использовать в качестве подзапроса
Поиски и гуглы результатов не дали ...
Заранее благодарен
Отредактированно skeef (22.08.2009 12:32:57)
Неактивен
Боюсь, что и эта штука будет с подзапросом:
SELECT user_id
FROM history_code
WHERE code = (SELECT MAX(code) FROM history_code);
Ключик на (code) не забудьте добавить.
Неактивен
Не совсем так.
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
т.е. выбрать последний код (по дате) для каждого пользователя
Неактивен
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);
Неактивен
Невероятно долго работает. Пришлось пересмотреть структуру базы для текущей задачи. Три подзапроса крутовато будет.
Что же касается данной таблицы историй, то видимо будет правильно создать поле-флаг и при вводе данных устанавливать в нем 1, что будет означать последняя запись, и сбрасывать флаг у предыдущей.
Благодарю тех кто откликнулся.
Неактивен
У Вас наверняка не хватает индексов, поэтому работает медленно. Но, конечно,
хорошая денормализация работает быстрее. С другой стороны — флаг — очень
неэкономное решение. Я бы сделал отдельную табличку с нужными id, если уж
денормализовывать.
Неактивен