#mysql #sql #subquery #where-clause #sql-in
#mysql #sql #подзапрос #where-предложение #sql-in
Вопрос:
Привет, кто-нибудь может выяснить, что не так с этим sql-запросом. Функция Not In не работает должным образом. в моей таблице идентификаторы 1 и 2 не должны извлекаться, поскольку они входят в подзапрос в функции not in.
select pr.id
,pc.title as category
,pc.points_required
,pc.total_leads_allowed
,pr.leadsSold
,pr.created
from ad_pro_requests pr
join ad_pro_categories pc
on pc.id = pr.cat_id
where pr.cat_id IN(1,2)
AND pr.id NOT IN(
select request_id
from ad_purchased_leads
where user_id = 8
)
And pr.leadsSold < pc.total_leads_allowed
And pc.active =1
And pr.status = 1
And pr.placeId = 'CA'
OR pr.placeId = 6077243
ORDER by id desc
limit 0,15
Комментарии:
1. Это почти наверняка
OR
то, что все портит. Заключите эту группу в круглые скобки.2. Кроме того, посмотрите, насколько проще следовать коду, когда вы правильно его форматируете? Пожалуйста, не заставляйте нас делать это за вас в будущем.
3. это сработало для меня, спасибо
4. @JoelCoehoorn спасибо, я новичок в этом. Я не знал
5. Ваш
WHERE
переводwhere (pr.cat_id IN(1,2) AND pr.id NOT IN( select request_id from ad_purchased_leads where user_id = 8 ) And pr.leadsSold < pc.total_leads_allowed And pc.active =1 And pr.status = 1 And pr.placeId = 'CA' ) OR )pr.placeId = 6077243)
. Это то, что вы хотите?
Ответ №1:
Вам, скорее всего, нужно заключить OR
условие в круглые скобки:
where
pr.cat_id in (1, 2)
and pr.id not in (...)
and ...
and (pr.placeid = 'CA' or pr.placeid = '6077243')
Или, что еще лучше, используйте in
:
where
pr.cat_id in (1, 2)
and pr.id not in (...)
and ...
and pr.placeid in ('CA', '6077243')
Обратите внимание, что я заключил буквальное число в одинарные кавычки, поскольку placeid
, похоже, это строка.
Я бы также предложил переписать in
условие как not exists
. Обычно это более эффективно и null
безопасно:
where
pr.cat_id in (1, 2)
and not exists (
select 1
from ad_purchased_leads apl
where apl.user_id = 8 and apl.request_id = pr.id
)
and pr.leadsSold < pc.total_leads_allowed
and pc.active =1
and pr.status = 1
and pr.placeid in ('CA', '6077243')
Для повышения производительности вам нужен индекс ad_purchased_leads(user_id, request_id)
.
Ответ №2:
OR
имеет более низкий приоритет, чем AND
. Ваш WHERE
перевод на
where (
pr.cat_id IN(1,2)
AND pr.id NOT IN(
select request_id
from ad_purchased_leads
where user_id = 8
)
And pr.leadsSold < pc.total_leads_allowed
And pc.active =1
And pr.status = 1
And pr.placeId = 'CA'
) OR (pr.placeId = 6077243)
Вы, вероятно, хотите
where pr.cat_id IN(1,2)
AND pr.id NOT IN(
select request_id
from ad_purchased_leads
where user_id = 8
)
And pr.leadsSold < pc.total_leads_allowed
And pc.active =1
And pr.status = 1
And (pr.placeId = 'CA' OR pr.placeId = 6077243)