остаток от пересечения нескольких IN

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
acidflash
Сообщения: 107
Зарегистрирован: 2015.09.03, 19:37

остаток от пересечения нескольких IN

Сообщение acidflash »

Добрый день, есть такой запрос SELECT * FROM `tbl_products` INNER JOIN `tbl_filter_relations` ON tbl_products.id = tbl_filter_relations.product_id WHERE ((`status`=1) AND (tbl_filter_relations.option_1 IN (283,275))) AND (tbl_filter_relations.option_4 IN (315,265))

он выбирает пересечение нескольких IN

Каким будет запрос, выбирающий все ОСТАЛЬНЫЕ записи?

казалось бы напрашивается SELECT * FROM `tbl_products` INNER JOIN `tbl_filter_relations` ON tbl_products.id = tbl_filter_relations.product_id WHERE ((`status`=1) AND ((tbl_filter_relations.option_1 NOT IN (283,275)) or (tbl_filter_relations.option_4 NOT IN (315,265)) )) , тем не менее выбираются не все записи.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: остаток от пересечения нескольких IN

Сообщение yan »

зачем переделывать полностью условие, наверное достаточно обрамить скобками и поставить NOT
acidflash
Сообщения: 107
Зарегистрирован: 2015.09.03, 19:37

Re: остаток от пересечения нескольких IN

Сообщение acidflash »

SELECT * FROM `tbl_products` INNER JOIN `tbl_filter_relations` ON tbl_products.id = tbl_filter_relations.product_id WHERE ((`status`=1) AND NOT((tbl_filter_relations.option_1 IN (283,275)) AND (tbl_filter_relations.option_4 IN (315,265)) )) получается. Еще где-то 300 записей потерялось
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: остаток от пересечения нескольких IN

Сообщение yan »

а не потерялись ли те записи у которых нет соответствующих в tbl_filter_relations? INNER JOIN ведь
acidflash
Сообщения: 107
Зарегистрирован: 2015.09.03, 19:37

Re: остаток от пересечения нескольких IN

Сообщение acidflash »

нет, к сожалению, даже запросы
SELECT * FROM `tbl_filter_relations` WHERE not ( tbl_filter_relations.option_1 IN (283,275) and tbl_filter_relations.option_4 IN (315,265) )
и
SELECT * FROM `tbl_filter_relations` WHERE ( tbl_filter_relations.option_1 IN (283,275) and tbl_filter_relations.option_4 IN (315,265) )
в сумме не дают
SELECT * FROM `tbl_filter_relations`
phpshko
Сообщения: 260
Зарегистрирован: 2015.03.21, 02:49

Re: остаток от пересечения нескольких IN

Сообщение phpshko »

acidflash писал(а):нет, к сожалению, даже запросы
SELECT * FROM `tbl_filter_relations` WHERE not ( tbl_filter_relations.option_1 IN (283,275) and tbl_filter_relations.option_4 IN (315,265) )
и
SELECT * FROM `tbl_filter_relations` WHERE ( tbl_filter_relations.option_1 IN (283,275) and tbl_filter_relations.option_4 IN (315,265) )
в сумме не дают
SELECT * FROM `tbl_filter_relations`
а такие 2 запроса

SELECT * FROM `tbl_filter_relations` WHERE ( tbl_filter_relations.option_1 IN (283,275) and tbl_filter_relations.option_4 NOT IN (315,265) )

SELECT * FROM `tbl_filter_relations` WHERE ( tbl_filter_relations.option_1 NOT IN (283,275) and tbl_filter_relations.option_4 IN (315,265) )

дают нужный результат?
acidflash
Сообщения: 107
Зарегистрирован: 2015.09.03, 19:37

Re: остаток от пересечения нескольких IN

Сообщение acidflash »

нет, как вариант

SELECT * FROM `tbl_products` INNER JOIN `tbl_filter_relations` ON tbl_products.id = tbl_filter_relations.product_id WHERE ((`status`=1) AND tbl_products.id not in(
SELECT s.product_id FROM tbl_filter_relations s WHERE s.option_1 IN (283,275) and s.option_4 IN (315,265)))

но он дюже тормозной
Ответить