Добрый день, есть такой запрос 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)) )) , тем не менее выбираются не все записи.
остаток от пересечения нескольких IN
Re: остаток от пересечения нескольких IN
зачем переделывать полностью условие, наверное достаточно обрамить скобками и поставить NOT
Re: остаток от пересечения нескольких IN
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 записей потерялось
Re: остаток от пересечения нескольких IN
а не потерялись ли те записи у которых нет соответствующих в tbl_filter_relations? INNER JOIN ведь
Re: остаток от пересечения нескольких IN
нет, к сожалению, даже запросы
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`
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`
Re: остаток от пересечения нескольких IN
а такие 2 запроса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`
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) )
дают нужный результат?
Re: остаток от пересечения нескольких IN
нет, как вариант
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)))
но он дюже тормозной
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)))
но он дюже тормозной