Функция SQL «NOT IN» не работает должным образом

#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)