SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 23.12.2014 16:36:37

BelOFF
Участник
Зарегистрирован: 29.10.2012
Сообщений: 11

Выбрать запись по последней дате из второй таблицы

Добрый день....

Головоломка заключается в следующем:

есть 2 таблицы:


DROP TABLE IF EXISTS `r`;
CREATE TABLE `r` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `s_id` tinyint(2) unsigned DEFAULT NULL,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;

INSERT INTO `r` VALUES ('1000', '5');
INSERT INTO `r` VALUES ('1001', '3');
INSERT INTO `r` VALUES ('1002', '20');
 
и

DROP TABLE IF EXISTS `s`;
CREATE TABLE `s` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `r_id` int(10) unsigned DEFAULT NULL,
  `s_id` int(4) unsigned DEFAULT NULL,
  `date` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ixRepairId` (`r_id`)
) ENGINE=InnoDB AUTO_INCREMENT=12686 DEFAULT CHARSET=utf8;

INSERT INTO `s` VALUES ('95', '1000', '1', '1393057360');
INSERT INTO `s` VALUES ('96', '1000', '5', '1393057426');
INSERT INTO `s` VALUES ('97', '1000', '16','1393058153');
INSERT INTO `s` VALUES ('98', '1000', '5','1393058200');
INSERT INTO `s` VALUES ('99', '1001', '1', '1393061330');
INSERT INTO `s` VALUES ('100', '1001', '3', '1393062687');
INSERT INTO `s` VALUES ('102', '1002', '1', '1393066636');
INSERT INTO `s` VALUES ('103', '1002', '16', '1393066660');
INSERT INTO `s` VALUES ('104', '1002', '20', '1393066674');
 


Задача:

Необходимо вытащить все записи из таблицы r где s_id < 20 и склеить (join) c таблицей s где самый свежий 'date' (в рамках одного r_id) меньше или равно текущей дате.

В результате должно получиться так:

+------+------------+
| r.id   | s.date       |
+------+------------+
| 1000| 1393058200|
| 1001| 1393062687|
+------+------------+

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

Отредактированно BelOFF (24.12.2014 12:02:14)

Неактивен

 

#2 23.12.2014 22:54:57

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

Re: Выбрать запись по последней дате из второй таблицы

Какое условие склейки таблиц?
"Свежесть" даты относительно текущей проверяется для всех записей с одинаковым r_id или только для тех, которые остаются после склейки.

Откуда в итоговой выборке строка
| 1001| 1393066660|
ошибка?

Неактивен

 

#3 24.12.2014 11:56:56

BelOFF
Участник
Зарегистрирован: 29.10.2012
Сообщений: 11

Re: Выбрать запись по последней дате из второй таблицы

vasya написал:

Какое условие склейки таблиц?
"Свежесть" даты относительно текущей проверяется для всех записей с одинаковым r_id или только для тех, которые остаются после склейки.

Откуда в итоговой выборке строка
| 1001| 1393066660|
ошибка?

| 1001| 1393066660| - действительно я ошибся (в ручную правил)? прошу прощения!

| 1001| 1393062687| - так!

Мне нужно, что бы в выборке участвовали только записи с последней датой для каждого r_id, и только те даты, которые меньше текущей (вообще под текущей, я понимаю 3-дня назад, т.к. в задаче у меня стоит выбрать записи, которые не обновлялись 3 дня, а в таблице s хранятся обновления).

Отредактированно BelOFF (24.12.2014 12:00:40)

Неактивен

 

#4 24.12.2014 17:09:28

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

Re: Выбрать запись по последней дате из второй таблицы

select t.* from r join
(select r_id, max(`date`) dd from s group by 1 having dd < UNIX_TIMESTAMP(now() - interval 3 day)) t on r.id=t.r_id
where r.s_id<20;

Неактивен

 

#5 24.12.2014 17:41:48

BelOFF
Участник
Зарегистрирован: 29.10.2012
Сообщений: 11

Re: Выбрать запись по последней дате из второй таблицы

vasya написал:

select t.* from r join
(select r_id, max(`date`) dd from s group by 1 having dd < UNIX_TIMESTAMP(now() - interval 3 day)) t on r.id=t.r_id
where r.s_id<20;

Спасибо огромное... Прям выручил... Гуру MySQL smile Все четко...

Неактивен

 

Board footer

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