Как сделать select?

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
brainiac
рядовой
Сообщения: 38
Зарегистрирован: 2011-05-10 14:59:08

Как сделать select?

Непрочитанное сообщение brainiac » 2013-01-10 14:04:27

Гуру, нид хелп!

Мускул 5.1
Есть код:

Код: Выделить всё

my $dsn = 'DBI:mysql:base:127.0.0.1';
my $db_user_name = 'aga';
my $db_password = 'ogo';
my $dbh = DBI->connect($dsn, $db_user_name, $db_password);

my $sgo = $dbh->prepare(qq{
SELECT tarifs_history.tar_id_old, tarifs_history.tar_id_new,tarifs_history.changed,tarifs.descr
FROM tarifs_history,tarifs
WHERE
tarifs_history.tar_id_new=tarifs.tar_id
AND tarifs_history.changed > '2008-08-01 00:00:00'
AND tarifs_history.changed < '2008-08-01 23:59:59'
AND tar_id_new > 108
AND tar_id_new < 121
});
$sgo->execute();
while (my ($tarold,$tarnew,$chang,$descr)=$sgo->fetchrow_array())
{
open (LOGF, ">>/usr/home/admin/changed") || die "$!";
print LOGF "$chang\t$descr\n";
close (LOGF);
}
В таблице tarifs находятся на тарифы с их названиями:

Код: Выделить всё

INSERT INTO `tarifs` (`tar_id`, `descr`, `cur_id`, `rent`, `block_rent`...`) VALUES
...
(1, 'Тариф 250', ..., NULL),
(53, 'Тариф 450', ..., NULL),
...
В таблице tarifs_history:

Код: Выделить всё

INSERT INTO `tarifs_history` (`tar_id`, `vg_id`, `tar_id_old`, `tar_id_new`, `c_date_new`, `rasp_time`, `changed`, `request_by`) VALUES
...
(22, 4111, 1, 53, '0000-00-00', '2008-08-01 22:33:05', '2008-08-01 22:33:05', 0),
(23, 3957, 1, 53, '0000-00-00', '2008-08-01 19:18:53', '2008-08-011 19:18:53', 0),
...
Представленным выше запросом я хочу сделать выборку из этих двух таблиц, и на выводе получить историю смены тарифов с их названиями а не с номерами из таблиц. Вобщем не знаю как tarifs.descr присвоить два значения для tarifs_history.tar_id_old и для tarifs_history.tar_id_new

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Neus
капитан
Сообщения: 1977
Зарегистрирован: 2008-09-08 21:59:56

Re: Как сделать select?

Непрочитанное сообщение Neus » 2013-01-10 20:25:40

Оптимизатор обрадуется такому запросу

brainiac
рядовой
Сообщения: 38
Зарегистрирован: 2011-05-10 14:59:08

Re: Как сделать select?

Непрочитанное сообщение brainiac » 2013-01-16 16:10:07

Оптимизатор? Не, не знаком с таким.
Запрос переделал, все получилось.

Gloft
лейтенант
Сообщения: 645
Зарегистрирован: 2008-03-09 11:32:12
Откуда: Москва

Re: Как сделать select?

Непрочитанное сообщение Gloft » 2013-11-22 9:09:35

Код: Выделить всё

SELECT
   (SELECT DISTINCT tarifs.descr
     FROM tarifs
     WHERE tarifs.tar_id=tarifs_history.tar_id_old) AS old_tarif,
   (SELECT DISTINCT tarifs.descr
     FROM tarifs
     WHERE tarifs.tar_id=tarifs_history.tar_id_new) AS new_tarif,
   tarifs_history.changed
FROM
   tarifs_history
WHERE
   tarifs_history.changed > '2008-08-01 00:00:00'
AND 
   tarifs_history.changed < '2008-08-01 23:59:59'
AND 
   tarifs_history.tar_id_new > 108
AND 
   tarifs_history.tar_id_new < 121