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.

Autor
Escrito por Jose Aguilar - Director ejecutivo y tecnológico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.
Te ha servido? Valora esta entrada!
(10 votos, promedio: 4 de 5)
Comparte en las redes sociales
¿Buscas trabajo de programador?

Una respuesta a “Sentencia NOT IN en SQL”

  1. Pedro dice:

    Perfecto me ha servido porque queria filtrar datos que no me interesaban de una tabla.

    saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.