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

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)
 

chira

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

в первом запросе нет условия соединения таблиц bn_site bs, bn_banners bb?
 

Apache_xp

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

Vadimka

Новичок
я пока что вот такой вариант сделал, но уверен что его можно и нужно усовершенствовать!
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";


п.с. также еще хотелось сделать проверку, если у банера есть профиль показа по определенным сайтам
 

chira

Новичок
а ты не хотел бы сразу определить нужный банер?
Код:
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
 

Vadimka

Новичок
Данный код работососпособный, но меня интересует нагрузка на сервер, что менее нагружает сервер, 2 запроса поочередно из которых второй невсегда выполняемый (при наличии у банер fb > 1) или 1 запрос ?
 

chira

Новичок
будут нужные индексы, проблем не должно быть ...
сделай EXPLAIN, проверь сам как это работает ...
 

Vadimka

Новичок
да поставил индексы на условия... большой разницы не замечено

еще одно уточнение:
мы делали проверку о возможности показа выбранного банера на этом сайте (по формату 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 равно текущему сайту то показываю банер, если нет - начинаю сначал...
 

chira

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

Vadimka

Новичок
непонимаю как правильно добавить еще одну таблицу?
условие должно проверяться если есть 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,'%')
 

chira

Новичок
вернее сказать можно ли использовать if в select
вам или доктору или учиться, учиться и учиться ...

мог бы попробовать въехать, как из двух твоих предыдущих запросов, получился один который я написал ...
поймёшь, дальше тебе будет легче с SQL-ми
 

Vadimka

Новичок
хорошо подколол меня...
дык учится, незря же сюда пришел :(
один запрос который ты написал тупо выполняет сравнение, а я повторюсь, мне надо если bb.profile > 0 то select ... from bla-bla
 

chira

Новичок
тебе не всегда нужно профиль поверять?
только когда bb.profile > 0?
если профиля нет, то банер не показываем?
 

Vadimka

Новичок
просто не у всех баннеров есть профиль...
правильно сказать если у банера есть профиль то я делаю еще один запрос (ПРОВЕРКУ):
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 раз
как это реализовать в моем случае?
 
Сверху