Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2009, 08:32   #1
acidcool
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 19
По умолчанию LEFT JOIN

Есть таблица Т1 с датами за последний месяц и таблица Т2, где те же даты и значения для них, но некоторые даты пропущены. Как мне с помощью функции LEFT JOIN сделать чтобы запрос выдавал ВСЕ даты за последний месяц и значения для них? Для тех дат, которых нет в Т2, должен выдавать ноль.
acidcool вне форума Ответить с цитированием
Старый 18.08.2009, 09:01   #2
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

select t1.data,znach
from t1 left join t2
on t1.data (//тут должно быть ключевое поле)=t2.data(//внешний ключ)
where t1.date>=первый день этого месяца в формате дд.мм.гггг
А СУБД какая?
Единственное, что ограничивает полет мысли программиста-компилятор

Последний раз редактировалось Sparky; 18.08.2009 в 09:03.
Sparky вне форума Ответить с цитированием
Старый 18.08.2009, 09:26   #3
acidcool
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 19
По умолчанию

Не получается. Вот текст моего запроса:

select T1.date, IFNULL(T2.value, 0)
from T1 left join T2 ON T1.date=date(T2.datetime) //там в формате datetime
where T1.date>='2009-07-31'
and T2.server_name='sg' and Т2.datatype='rate'; //это доп-е условия

и выдает только те даты, которые есть в Т2

П.С.: У меня MySQL
acidcool вне форума Ответить с цитированием
Старый 18.08.2009, 12:53   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

может тебе нужно
left outer join ?!
soleil@mmc вне форума Ответить с цитированием
Старый 18.08.2009, 13:48   #5
acidcool
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 19
По умолчанию

Может быть. А в чем разница?
acidcool вне форума Ответить с цитированием
Старый 18.08.2009, 14:35   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от acidcool Посмотреть сообщение
Может быть. А в чем разница?
здесь пишут, что outer по умолчанию имеется в виду (для меня понятнее когда оно явно указано)

смоделировал твой случай и твой запрос - нормально все возвращает
думаю, что у тебя проблема в сравнении дат - их нужно привести к одному формату
soleil@mmc вне форума Ответить с цитированием
Старый 18.08.2009, 15:55   #7
acidcool
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 19
По умолчанию

вроде получилось, только как сделать чтобы значения выдавались только те, для которых выполняется нужное мне условие? я писал и в "where" и в "ON". в "where" выдает Empty Set, в "ON" - все значения выдает нулевые.

Вот мой запрос:

select T1.datetime, IFNULL(avg(T2.value), 0)
from T1
left outer join T2 ON T2.datetime=T1.datetime
group by T1.datetime;
acidcool вне форума Ответить с цитированием
Старый 18.08.2009, 16:05   #8
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

согласись, так выглядит читабельнее (обрати внимание на изменения в положении функи IFNULL)
Код:
select T1.datetime, avg(IFNULL(T2.value, 0))
from T1
left outer join T2 ON T1.datetime=T2.datetime
group by T1.datetime
а все почему - потому что есть тег CODE
и эттаа...
для читабельности принято и условие объединения писать в том же порядке что и таблицы
soleil@mmc вне форума Ответить с цитированием
Старый 18.08.2009, 16:17   #9
acidcool
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 19
По умолчанию

За советы спасибо, но все же, куда писать доп. условие?
acidcool вне форума Ответить с цитированием
Старый 18.08.2009, 16:49   #10
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от acidcool Посмотреть сообщение
За советы спасибо, но все же, куда писать доп. условие?
какое?
ты про это?
Код:
select T1.datetime, avg(IFNULL(T2.value, 0))
from T1
left outer join T2 ON T1.datetime=T2.datetime
where T1.date>='2009-07-31' 
   and T2.server_name='sg' 
   and Т2.datatype='rate'
group by T1.datetime

может задать сразу все вопросы?!
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
INNER JOIN в Delphi не работает. Droid БД в Delphi 2 03.07.2009 12:30
join в sql tsergey Помощь студентам 1 12.02.2009 13:10
join wall66 SQL, базы данных 2 10.11.2008 16:44
Ошибка Left Side cannot be assigned to.. DM_bite Помощь студентам 1 18.09.2008 21:01
не получается запрос с inner join :mad: Только_Учусь SQL, базы данных 16 21.07.2008 09:40