SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 06.03.2012 15:12:53

demoniqus
Участник
Зарегистрирован: 05.03.2012
Сообщений: 10

Помогите, пожалуйста, составить правильный запрос

Вот мой запрос
select * from order_status group by order_id order by date_time desc
а вот задание
Имеем таблицу order_status с полями id, date_time, order_id, status. Для каждого значения order_id может существовать 1 или несколько значений status.Требуется написать запрос, при котором будет получено последнее (по дате) значение status для каждого order_id.

Структура и данные таблицы:
-- ----------------------------
-- Table structure for `orders_status`
-- ----------------------------
DROP TABLE IF EXISTS `orders_status`; CREATE TABLE
`orders_status` (
`id` bigint(20) NOT NULL auto_increment,
`date_time` datetime default NULL,
`order_id` bigint(12) default NULL,
`status` tinyint(2) default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `order_id` (`order_id`,`status`)
) ENGINE=MyISAM AUTO_INCREMENT=26817 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of orders_status
-- ----------------------------
INSERT INTO `orders_status` VALUES ('1', '2009-04-07 05:05:10', '1',
'1'); INSERT INTO `orders_status` VALUES ('2', '2008-11-29 18:12:58',
'2', '1'); INSERT INTO `orders_status` VALUES ('3', '2009-04-07
04:46:36', '3', '1'); INSERT INTO `orders_status` VALUES ('4',
'2009-04-07 04:41:55', '5', '1'); INSERT INTO `orders_status` VALUES
('5', '2008-11-06 15:46:06', '6', '1'); INSERT INTO `orders_status`
VALUES ('6', '2009-04-07 04:22:41', '6', '2'); INSERT INTO
`orders_status` VALUES ('7', '2008-11-06 07:07:44', '5', '3'); INSERT
INTO `orders_status` VALUES ('8', '2008-10-22 00:46:13', '4', '3');
INSERT INTO `200810_orders_status` VALUES ('9', '2009-04-07 04:22:03', '3',
'2'); INSERT INTO `orders_status` VALUES ('10', '2009-04-07
04:20:52', '3', '3'); INSERT INTO `orders_status` VALUES ('11',
'2009-04-07 04:03:32', '1', '2'); INSERT INTO `orders_status` VALUES
('12', '2009-04-07 02:43:49', '2', '3');

Пожалуйста, сильно не пинайте меня, т.к. я полнейший чайник в этом вопросе...

Неактивен

 

#2 06.03.2012 17:12:27

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите, пожалуйста, составить правильный запрос

select status from order_status o join
(select order_id, max(date_time) mdate from order_status group by order_id) t
on o.order_id=t.order_id and o.date_time=t.mdate;
 


Upd: подробнее см, например, http://sqlinfo.ru/forum/viewtopic.php?pid=30427#p30427

Неактивен

 

#3 06.03.2012 23:22:43

demoniqus
Участник
Зарегистрирован: 05.03.2012
Сообщений: 10

Re: Помогите, пожалуйста, составить правильный запрос

Если можно, то дайте полную расшифровку каждой буквы в вашем выражении... совсем ничего не понимаю

Неактивен

 

#4 07.03.2012 06:00:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите, пожалуйста, составить правильный запрос

http://webew.ru/posts/2823.webew#4172

Если после прочтения вопросы не исчезнут, то конкретизируйте их.

Неактивен

 

#5 13.03.2012 11:27:31

demoniqus
Участник
Зарегистрирован: 05.03.2012
Сообщений: 10

Re: Помогите, пожалуйста, составить правильный запрос

С псевдонимами немного разобрался, но все-таки вопросы возникают...

я пробую запрос select order_id, MAX(date_time) mdate from order_status group by order_id - по идее он мне уже выдает нужный результат... зачем все остальное? Тяжко быть деревянным по пояс, да еще с обеих сторон...
ЗЫ Я ведь правильно понимаю принцип работы оператора GROUP BY? В данном случае он сортирует таблицу по полю order_id. Далее берет группу записей с одинаковым order_id, а затем выбирает единственную запись, удовлетворяющую следующим условиям: дополнительных условий типа WHERE, ON не имеется, но есть ограничение в запрашиваемых полях в виде MAX(date_time) - исходя из этого он берет не первую попавшуюся запись из группы, а имеющую максимальное время. Далее он переходит группу записей со следующим order_id.

Неактивен

 

#6 13.03.2012 12:05:58

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите, пожалуйста, составить правильный запрос

Этот запрос выбирает пару значений order_id, MAX(date_time), а если вы добавите другие требуемые поля, то будет выбрана произвольная строка, а не с максимальным date_time.

Неактивен

 

#7 13.03.2012 12:40:46

demoniqus
Участник
Зарегистрирован: 05.03.2012
Сообщений: 10

Re: Помогите, пожалуйста, составить правильный запрос

т.е. внутренний запрос отбирает для каждого order_id максимальное date_time. Получается что-то типа таблички
order_id        date_time
1            [максимальное значение]
...            [максимальное значение]
n            [максимальное значение]
и, если бы мне не требовались другие поля, то этого было бы достаточно... ТАК?
данный результат сохраняется под псевдонимом t.
Затем берется вся исходная таблица (order_status - для краткости ей присваивается псевдоним o) и соединяется с таблицей  результатов внутреннего запроса t с учетом двух дополнительных условий. Использование JOIN без LEFT, RIGHT заставляет mysql не заполнять NULL'ами несовпавшие строки, а просто их пропустить?

Неактивен

 

#8 13.03.2012 13:08:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите, пожалуйста, составить правильный запрос

Да, на оба вопроса.

Неактивен

 

Board footer

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