помогите объеднить 2 запроса в 1

  • Автор темы Автор темы Vadimka
  • Дата начала Дата начала

Vadimka

Новичок
помогите объеднить 2 запроса в 1

есть 1 запрос, выбирает случайный банер, формат банера, сайт банера, по условию кроме своего сайта

SELECT bb.id, bb.format, bb.id_site ....
FROM bn_site bs, bn_banners bb
WHERE bs.id! = '5'

вторым запросом проверяю можно ли на моем сайте показывать этот формат банера
SELECT fb
FROM bn_site WHERE fb LIKE '%$format%' AND id=5 LIMIT 1
поле fb SET(1,2,3)
 
есть 1 запрос, выбирает случайный банер
где видно, что запрос выбирает именно случайный банер?

в первом запросе нет условия соединения таблиц bn_site bs, bn_banners bb?
 
Автор оригинала: Vadimka
ты чего прикалываешься :) или тебе весь запрос показать :)
Да уж буть любезен!
И, если конечно я тебя правильно понял,
Ты с начала выбираешь что - то (банер, формат, сайт ....)
а затем смотришь : что ж за фигню я сделал? :eek:
И если она не подходит то выбираешь заново?(опять таки это если я тебя правильно понял)
Такой подход не совсем правильный мягко говоря
Если ты более конкретно сформулируешь задачу, то будет проще тебе помоч
 
я пока что вот такой вариант сделал, но уверен что его можно и нужно усовершенствовать!
1. выбираю в цикле возможные для показа на этом сайте банера, также формат и номер сайта банера

$q="SELECT bb.id, bb.id_site, bb.format MD5(RAND()) AS RANDOM FROM bn_banners bb, bn_site bs WHERE bs.balance2 > 0 AND bb.action='0' AND bb.action_site='0' AND bb.format_seti='$format_seti' AND bb.id_site!='$id_site' AND bb.id_site=bs.id ORDER BY RANDOM";
while(list($idb,$id_siteN,$format_b2)=mysql_fetch_row($r)){

2. а затем сравниваю можно ли на этом сайте показывать данные банер
$rs="SELECT fb FROM bn_site WHERE fb LIKE '%$format_b2%' AND id=$id_site LIMIT 1";


п.с. также еще хотелось сделать проверку, если у банера есть профиль показа по определенным сайтам
 
а ты не хотел бы сразу определить нужный банер?
Код:
SELECT fb
FROM bn_banners bb
, bn_site bs
, bn_site bs2
WHERE bs.balance2 > 0
 AND bb.action='0'
 AND bb.action_site='0'
 AND bb.format_seti='$format_seti'
 AND bb.id_site!='$id_site'
 AND bb.id_site=bs.id 
 AND bs2.id='$id_site'
 AND bs2.fb LIKE CONCAT('%',bb.format,'%')
ORDER BY RAND()
LIMIT 1
 
Данный код работососпособный, но меня интересует нагрузка на сервер, что менее нагружает сервер, 2 запроса поочередно из которых второй невсегда выполняемый (при наличии у банер fb > 1) или 1 запрос ?
 
будут нужные индексы, проблем не должно быть ...
сделай EXPLAIN, проверь сам как это работает ...
 
да поставил индексы на условия... большой разницы не замечено

еще одно уточнение:
мы делали проверку о возможности показа выбранного банера на этом сайте (по формату bb.format), возможно ли в данный код добавить еще одно условие, bb.profile - выбранный банер допустим имеет профиль с показом на определенные сайты...

для этого у меня создана таблица:
2 поля, bps.id_site - сайт на котором нужно показывать банер,
bps.id_profile - номер профиля

SELECT bps.id_site FROM bn_profile_site bps WHERE bps.id_profile='$profile' LIMIT 1
далее, если bps.id_site равно текущему сайту то показываю банер, если нет - начинаю сначал...
 
да поставил индексы на условия... большой разницы не замечено
на глаз мерил? цифры где?
хочешь более конкретный совет, дай более подробные данные
SELECT bps.id_site FROM bn_profile_site bps WHERE bps.id_profile='$profile' LIMIT 1
далее, если bps.id_site равно текущему сайту то показываю банер, если нет - начинаю сначал...
добавь ещё одну таблицу в селект и посмотри
зачем циклы на PHP гонять ища, а нужный банер ...
напиши запрос и он тебе вернёт банер, если не вернул, значит такого банера нет.
 
непонимаю как правильно добавить еще одну таблицу?
условие должно проверяться если есть bb.profile?

SELECT bb.profile ....

а так всегда проверяется условие:
AND bp.id = bb.profile
AND bp.id_sites LIKE CONCAT('%',$id_site,'%')

-~{}~ 18.02.05 00:11:

вернее сказать можно ли использовать if в select
чтото типа:
if bb.profile > 0 select ... from bp.id = bb.profile
AND bp.id_sites LIKE CONCAT('%',$id_site,'%')
 
вернее сказать можно ли использовать if в select
вам или доктору или учиться, учиться и учиться ...

мог бы попробовать въехать, как из двух твоих предыдущих запросов, получился один который я написал ...
поймёшь, дальше тебе будет легче с SQL-ми
 
хорошо подколол меня...
дык учится, незря же сюда пришел :(
один запрос который ты написал тупо выполняет сравнение, а я повторюсь, мне надо если bb.profile > 0 то select ... from bla-bla
 
тебе не всегда нужно профиль поверять?
только когда bb.profile > 0?
если профиля нет, то банер не показываем?
 
просто не у всех баннеров есть профиль...
правильно сказать если у банера есть профиль то я делаю еще один запрос (ПРОВЕРКУ):
select * from bn_profile bp
WHERE bp.id = bb.profile
AND bp.id_sites LIKE CONCAT('%',$id_site,'%')
в профиле банера указаны bp.id_sites на которых можно показывать банер
если условие верно то показываем банер

-~{}~ 18.02.05 12:44:

уже разобрался сам

LEFT JOIN bn_profile bp ON bp.id = bb.profile AND bp.id_sites LIKE CONCAT('%',bb.id_site,'%') AND bp.onoff='1'

спасибо моему помощнику :)
но хотелось задать еще один вопросик :), знаю что существует такая вещь как приоритет банера, т.е. есть 3 банера:
1 - 100 приоритет, 2 - 200 приоритет, 3 - 700 приоритет, следовательно 1 баннер должен показаться 1 раз, второй 2 раза, третий 7 раз
как это реализовать в моем случае?
 
Сверху