Если кому не лень помогите с запросом

vonica

Новичок
Если кому не лень помогите с запросом

есть такая таблица
каждая строка курс валюты в банке города за определенную дату
bankCourses
Код:
bankId  courseDate    usdSale  usdBid  eurSale  eurBid  rurSale  rurBid
1      2008-05-06    100      110 	200 	    210     300   310
5      2008-05-06    400      410 	500 	    510     600   610
1      2008-05-07    100      111 	200 	    210     300   310
и такая таблица
справочник банков
bankCourses
Код:
bankId
1
5
есть такой запрос:
[SQL]
SELECT *
FROM
`bankSpr`
LEFT JOIN
(
SELECT
`nd`.*,
`od`.`bankId` `obankId`,
`od`.`courseDate` `ocourseDate`,
`od`.`usdSale` `ousdSale`,
`od`.`usdBid` `ousdBid`,
`od`.`eurSale` `oeurSale`,
`od`.`eurBid` `oeurBid`,
`od`.`rurSale` `orurSale`,
`od`.`rurBid` `orurBid`
FROM
(
SELECT *
FROM
`bankCourses`
WHERE
`courseDate` = DATE(NOW())
) `nd`
LEFT JOIN
(
SELECT *
FROM
`bankCourses`
WHERE
`courseDate`< DATE( NOW() )
ORDER BY `courseDate` DESC
LIMIT 1
) `od`
USING (`bankId`)

) `result`
USING (`bankId`)
[/SQL]

хочу получить в каждой строке
сегодняшний курс по каждому банку + предыдущий день (не вчерашний)
но вот не все так как хочется

Заранее спасибо за внимание!
 

amadeus

Новичок
Боюсь я "местных джедаев", порвут, как тузик грелку, за помощь в составлении запроса с многочисленными вложенными ;)
Существующий запрос не дает желаемого результата из-за последнего (по порядку сверху вниз) SELECT-а, он выбирает одну и ту же запись только для одного Банка, соответственно для остальных банков предыдущего дня в его результате нет. Вобщем, его и нужно переделать, заставив, либо выбирать по одной записи на каждый существующий банк с предпоследней датой, либо выбирать одну запись, но всякий раз для конкретного банка. Ну, кроме того, при так построенной связи между запросами, пока не введены курсы на текущий день, предыдущий тоже выбираться не будет.
Примерно такой запрос
[SQL]
SELECT *
FROM (
`bankSpr`
LEFT JOIN (
SELECT *
FROM `bankCourses`
WHERE `courseDate` = DATE( NOW( ) )
) `nd`
USING ( `bankId` )
)
LEFT JOIN (
SELECT *
FROM (
SELECT *
FROM `bankCourses`
WHERE `courseDate` < DATE( NOW( ) )
ORDER BY `courseDate` DESC
) `sorted`
GROUP BY `bankId`
) `od`
ON `bankSpr`.`bankId` = `od`.`bankId`
[/SQL]
даст желаемый результат. Однако, это всё удобно при малом числе записей, а на практике лучше разбить его на два-три запроса и возложить обработку результатов на программный код.
 

nirex

Новичок
select ... from bankSpr
left join bankCourses bC1 on bankSpr.bankId = bC1.bankId and bC1.`courseDate` = DATE( NOW( ) )
left join bankCourses bC2 on bankSpr.bankId = bC2.bankId and bC2.`courseDate` < DATE( NOW( ) )
 

amadeus

Новичок
Автор оригинала: nirex
select ... from bankSpr
left join bankCourses bC1 on bankSpr.bankId = bC1.bankId and bC1.`courseDate` = DATE( NOW( ) )
left join bankCourses bC2 on bankSpr.bankId = bC2.bankId and bC2.`courseDate` < DATE( NOW( ) )
Такой запрос вернет не по одной записи на каждый банк, а столько, сколько есть записей по банку с датой менее текущего дня. Так что как готовый результат не годится.

-~{}~ 15.05.08 12:10:

А при дальнейшей обработке результата можно и попроще запросами обойтись.
 

nirex

Новичок
Ну так вложи последний с limit 1 и все.
Вот проблема и работать будет быстрее чем все остальное
 

nirex

Новичок
select ... from bankSpr bS
left join bankCourses bC1 on bS.bankId = bC1.bankId and bC1.`courseDate` = DATE( NOW( ) )
left join (select * from bankCourses where bS.bankId = bankId and `courseDate` < DATE( NOW( ) ) order by courseDate desc limit 1) bC2

-~{}~ 15.05.08 14:01:

on bC2.bankId is not null забыл :)))
 

amadeus

Новичок
Ну, это просто к ошибке приведет. Сначала потому, что второму join тоже нужен on или using, потом потому что bS во вложенном запросе не поймет.
А если bS.bankId=bC2.bankId перенести в ON, то с limit вернемся к тому результату, который как раз не устроил автора вопроса - по одному банку всё верно, по остальным предыдущий курс NULL.
Не строчи, как из пулемета, плохо продуманным. Вникни лучше в задачу и придумай что-то изящное без многократных вложений.

-~{}~ 15.05.08 14:14:

А bS во вложенном запросе ничего не значит
 

nirex

Новичок
amadeus
ухахахахах ты пробовал???? )))))))

Неблагодарное дело помогать, всегда знал ))))
 

Alexandre

PHPПенсионер
vonica просьба на будущее,
тему поста называть в соответствии с темой вопроса
например "как составить запрос объединения двух таблиц с выводом данных за определенный период."

может кто-то будет искать похожую информацию на форуме, а по твоей теме не понятно о чем речь
 
Сверху