Sentencia NOT IN en SQL
En algunos casos cuando estamos creando un sitio e-commerce por ejemplo y deseamos mostrar productos destacados y nuevos en página de inicio pudiera darse el caso de que se duplicara algún producto que esté como destacado y que además sea nuevo.
En SQL se puede excluir de una consulta varios elementos de la siguiente forma:
SELECT * FROM products WHERE `id_product` NOT IN (1,2,3,4,7,9)
La consulta anterior te rotornaría todos los productos de tu tienda sin incluir los que tengan como id 1,2,3,4,7 0 9.
Con este problema me he visto programando con Oscommerce por ejemplo y su solución fue:
Los productos destacados los recogeríamos de la siguiente forma:
$featured_products_query = tep_db_query("select distinct p.products_id, p.products_image, p.products_tax_class_id, s.status as specstat, s.specials_new_products_price, p.products_price from " . TABLE_PRODUCTS . " p left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " . TABLE_CATEGORIES . " c left join " . TABLE_FEATURED . " f on p.products_id = f.products_id where p.products_id = p2c.products_id and p2c.categories_id = c.categories_id and c.parent_id = '" . $featured_products_category_id . "' and p.products_status = '1' and f.status = '1' order by rand() DESC limit " . MAX_DISPLAY_FEATURED_PRODUCTS); while ($featured_products = tep_db_fetch_array($featured_products_query)) { $array_ids_featured[] = $featured_products['products_id']; ... }
Fíjate que estamos guardando en un array los ids de los productos destacados. Y la consulta para visualizar los nuevos productos la haríamos así:
$new_products_query = tep_db_query("select p.products_id, p.products_image, p.products_tax_class_id, pd.products_name, p.products_price, s.specials_new_products_price from " . TABLE_PRODUCTS . " p left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' and p.products_id NOT IN ('" . (count($array_ids_featured) > 0 ? implode(",", $array_ids_featured):0) . "') order by RAND() limit " . MAX_DISPLAY_NEW_PRODUCTS);
Estamos cogiendo todos los productos nuevos que no aparezcan en destacados.
Perfecto me ha servido porque queria filtrar datos que no me interesaban de una tabla.
saludos