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.

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (No hay votos)
Cargando…

Comparte en las redes sociales

Escrito por Jose Aguilar - Experto programador Prestashop y Wordpress.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*