Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




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 - 01/08/2013 - 11:55:46
Subject:Выбор id одной таблицы по трем полям другой
-----------------
Ок. Попробую максимально подробно. Итак, две таблицы:

CREATE TABLE IF NOT EXISTS card (
id MEDIUMINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
client MEDIUMINT UNSIGNED NOT NULL,
type TINYINT(1) UNSIGNED NOT NULL,
FOREIGN KEY (type) REFERENCES cardtype (id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (client) REFERENCES clt_client (id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS histor (
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
crdtype TINYINT(1) UNSIGNED NOT NULL,
srvtype TINYINT(1) UNSIGNED NOT NULL,
value DECIMAL(9,2) NOT NULL,
enterdate DATE NOT NULL,
FOREIGN KEY (crdtype) REFERENCES cardtype (id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

Таблица card ссылается на таблицу client - база физ.лиц, и обе - на таблицу cardtype, содержащую тупо список названий бланков с их id.

Таблица card содержит список бланков на каждого клиента, у каждого клиента может быть несколько бланков разного типа.
В таблице histor - тарифы по этим бланкам. В ней value - сам тариф, - crdtype - тип бланка, srvtype - тип услуги. У одного типа бланков для разных услуг тарифы отличаются.
Далее, тарифы имеют ограниченное время действительности. Определяется по enterdate. Т.е. тариф действителен с даты enterdate и до дня, когда введен новый тариф. Соответственно, нужный тариф вытаскивается по условию, что у него должна быть максимальная enterdate, но не больше той, на который день мы ищем тариф.

Задача: Известен id клиента, на которого может быть записано несколько бланков разного типа. Известен тип услуги, на которую оформляется заказ. Известна дата оформления. Нужно найти id того бланка, из имеющихся у данного клиента, у которого максимальный тариф на день оформления.

Если делать выборку по циклу перловским скриптом, то работающее решение выглядит так:
#Условия: $clntid - id клиента, $trfdate - дата оформления, $service - тип услуги.
$newcard = ''; $tarif = 0;
$sth = $dbh->prepare("SELECT id, type FROM card WHERE client = $clntid ORDER BY id");
$sth->execute();
while ($row = $sth->fetchrow_arrayref())
{
$tmptrf = $dbh->selectrow_array("SELECT value FROM histor WHERE srvtype = $service AND crdtype = $row->[1] AND enterdate <= $trfdate ORDER BY enterdate DESC LIMIT 1");
if ($tmptrf >= $tarif) {
$newcard = $row->[0];
$tarif = $tmptrf;
}
}
$sth->finish();

Т.е. циклом обходятся все бланки данного клиента, по каждому из них вытаскивается актуальный тариф на день оформления, он сравнивается с максимальным и если больше или равно - перезаписывается вместе с запомненным id бланка. Поскольку проверка больше или равно, то при наличии нескольких бланков одинакового типа, в результате получится последний из них по id.



[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
42789



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |