|
MySQL.RU - Webboard
Вернуться
Выбор id одной таблицы по трем полям другой (Vasily) 22/07/2013 - 16:26:54
Re: Выбор id одной таблицы по трем полям другой (Akina) 23/07/2013 - 23:48:16
Re: Выбор id одной таблицы по трем полям другой (Vasily) 24/07/2013 - 11:38:20
Re: Выбор id одной таблицы по трем полям другой (Akina) 26/07/2013 - 22:05:22
Re: Выбор id одной таблицы по трем полям другой (Vasily) 01/08/2013 - 11:55:46
Re: Выбор id одной таблицы по трем полям другой (Akina) 05/08/2013 - 14:13:41
Re: PS. (Akina) 05/08/2013 - 14:17:18
Re: Выбор id одной таблицы по трем полям другой (Vasily) 07/08/2013 - 12:08:35
Re: Выбор id одной таблицы по трем полям другой (Akina) 07/08/2013 - 13:45:24
Re: Выбор id одной таблицы по трем полям другой (Vasily) 07/08/2013 - 15:35:22
Re: Выбор id одной таблицы по трем полям другой (Akina) 07/08/2013 - 21:31:47
Re: Выбор id одной таблицы по трем полям другой (Vasily) 08/08/2013 - 10:16:54
Re: Выбор id одной таблицы по трем полям другой (Akina) 08/08/2013 - 14:47:33
Re: Выбор id одной таблицы по трем полям другой (Vasily) 08/08/2013 - 18:09:32
Re: Выбор id одной таблицы по трем полям другой (Akina) 08/08/2013 - 18:32:08
Re: Выбор id одной таблицы по трем полям другой (Vasily) 08/08/2013 - 18:47:01
> Original message text:
> From: Vasily - 22/07/2013 - 16:26:54
> Subject:Выбор id одной таблицы по трем полям другой
> -----------------
> Здравствуйте. Прошу помочь с решением задачи, т.к. тривиальные решения не дали нужного результата и фантазия закончилась.
>
> Есть две таблицы: card(id, client, type) и histor(value, type, srv, enterdate). Столбцы type у обоих таблиц совпадают.
>
> Требуется: вывести один id из таблицы card для client = X, тот из них, у type которого максимальное значение value в таблице histor, по условию, что srv в ней должно быть равно Y, а enterdate старшая, но не больше Z.
>
> Возможно ли решение такой задачи одним запросом, или требуется проверка по циклу из perl-скрипта?
>
From: Vasily - 07/08/2013 - 15:35:22
Subject:Выбор id одной таблицы по трем полям другой
-----------------
Ок. Вот набор с несколько большим набором значений. таблицу crdtype добавил для ясности, т.к. card и histor не могут быть связаны напрямую, не являясь дочерними друг для друга.
CREATE TABLE IF NOT EXISTS cardtype (
id TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS card (
id MEDIUMINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
client MEDIUMINT UNSIGNED NOT NULL,
type TINYINT UNSIGNED NOT NULL,
FOREIGN KEY (type) REFERENCES cardtype (id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS histor (
crdtype TINYINT UNSIGNED NOT NULL,
srvtype TINYINT UNSIGNED NOT NULL,
value DECIMAL(5,2) NOT NULL,
enterdate DATE NOT NULL,
FOREIGN KEY (crdtype) REFERENCES cardtype (id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
INSERT cardtype (id, name) VALUES
(1, 'Card 1'),
(2, 'Card 2'),
(3, 'Card 3'),
(4, 'Card 4');
INSERT card (id, client, type) VALUES
(33, 10, 1),
(34, 12, 4),
(35, 14, 1),
(38, 14, 3),
(39, 8, 1),
(40, 8, 3),
(41, 8, 4),
(45, 19, 2),
(46, 19, 3),
(47, 19, 2),
(48, 19, 4);
INSERT histor (value, crdtype, srvtype, enterdate) VALUES
('3.00', 1, 5, '2013-03-01'),
('8.50', 1, 5, '2013-07-01'),
('3.55', 1, 5, '2013-08-05'),
('4.00', 2, 5, '2013-03-01'),
('4.50', 2, 5, '2013-07-01'),
('4.55', 2, 5, '2013-08-05'),
('5.00', 3, 5, '2013-03-01'),
('5.50', 3, 5, '2013-07-01'),
('5.55', 3, 5, '2013-08-05'),
('2.00', 4, 5, '2013-03-01'),
('2.50', 4, 5, '2013-07-01'),
('2.55', 4, 5, '2013-08-05'),
('9.25', 1, 7, '2013-03-01'),
('3.75', 1, 7, '2013-07-01'),
('9.00', 2, 7, '2013-03-01'),
('4.75', 2, 7, '2013-07-01'),
('5.25', 3, 7, '2013-03-01'),
('3.50', 3, 7, '2013-07-01'),
('2.00', 4, 7, '2013-03-01'),
('2.25', 4, 7, '2013-07-01');
Соответственно, если искать нужный бланк для клиента 14, услуги 5, на 10 августа, то результатом будет card.id:38, т.к. card.type:3 будет соответствовать тариф 5.55 от 2013-08-05, а card.id:1 - 3.55 от того же числа.
Если для того же клиента и типа услуги провести поиск на 1 августа, то результатом должен стать card.id:35, т.к. на 1 августа актуальны тарифы от 2013-07-01, где у histor.crdtype:1 value рвен 8.50, что больше, чем 5.50 у histor.crdtype:3.
Если же искать бланк для card.client = 19 и histor.srvtype = 7 на дату 2013-05-01, то результатом дожен быть card.id: 47, т.к. у histor.crdtype:2 самый большой тариф из имеющихся у клиента 19 бланков на тот момент, но таких бланков у него два и взялся старший по id.
[Это сообщение - спам!]
Последние сообщения из форума
Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
42789
|
|