Búsqueda


Categorías

C# [15]
PHP [6]
Zend [1]
FileMaker [1]
.NET [6]
CVS [3]
General [9]
Javascript [2]
Paypal [1]
.NET Compact Framework [3]
C++ [1]
mysql [4]
Linux [1]

Últimos post

Dónde guardar los archivos de configuración en ClickOnce
phpinfo: Valores en error_reporting
Notes about Zend Server and Zend Studio setup
What's new in C# 4
Resolving a 'sticky tag is not a branch' error
Resumen del CodeCamp
CodeCamp Tarragona 2009
Acerca de la calidad del código
ClickOnce en Linux
Programando en PHP (y con CVS) en Visual Studio 2008

Sindicación

RSS 0.90
RSS 1.0
RSS 2.0
Atom 0.3

INNER JOIN y COUNT

ctg | 22 Febrero, 2006 23:45

De vez en cuando, me toca realizar alguna consulta SQL un poco especial. Para no tener que echar mano al libro de Paul Dubois, MySql, o visitar alguna web dónde pueda “refrescar” mis conocimientos sobre SQL, dejo aquí algunos apuntes que pueden ser útiles.

Ejemplo 1)

Con la siguiente consulta se genera una tabla dónde aparecen todos los campos de la tabla jss_products y también los campos que tengan concordancia en la cláusula ON de la tabla jss_products_tree. Esta consulta se realiza para obtener una tabla con todos los productos (jss_products) y sus id de sección (jss_products_tree)

SELECT * FROM jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid

Ejemplo 2)

Las tabla jss_products_tree sólo contiene el Id de la sección y no su nombre. Este nombre se encuentra en la tabla jss_sections. Por lo tanto, para realizar una tabla en la que se encuentre el nombre de la sección, se debe utilizar la siguiente consulta

SELECT * FROM (jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid)INNER JOIN jss_sections ON jss_sections.sectionId = jss_products_tree.sectionid

Recordar que INNER JOIN muestra las líneas que contengan al menos un registro de la tabla que hayamos escrito a la derecha.

Para no repetir los campos (y evitar confusiones) en vez de utilizar * para seleccionar todos los campos, colocaremos los nombres de los campos que queremos consultar. La sentencia quedará más larga, pero la tabla mucho más sencilla.

SELECT jss_products.productId, jss_products.code, jss_products.name, jss_products.description, jss_products_tree.sectionId, jss_sections.title FROM (jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid)
INNER JOIN jss_sections ON jss_sections.sectionId = jss_products_tree.sectionid

Si queremos saber el id del producto, su id de sección y el nombre de la sección:

SELECT jss_products.productId, jss_sections.sectionid, jss_sections.title FROM
(jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid)
INNER JOIN jss_sections ON jss_sections.sectionId = jss_products_tree.sectionid

Y normalmente, en un buscador, se muestra el nombre de la sección y entre paréntesis, el número de artículos. Para conseguir el número de artículos utilizamos el operador COUNT(*). Al utilizar este operador, es necesario también utilizar GROUP BY.

SELECT count(*) as totalfound, jss_sections.sectionid, jss_sections.title FROM (jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid)
INNER JOIN jss_sections ON jss_sections.sectionId = jss_products_tree.sectionid group by jss_sections.sectionId

Ejemplo 3)

Se quiere buscar un producto. Queremos que buscar las secciones y el número de productos que tiene esa sección. Por ejemplo, si buscamos la palabra curado, es perfectamente posible que existan varios productos con esta palabra en su nombre. Incluso, estos productos pueden estar en secciones diferentes. Para mostrar los productos, utilizaremos la siguiente sentencia:

SELECT jss_products.productId, jss_products.name, jss_sections.sectionid, jss_sections.titleFROM (jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid)INNER JOIN jss_sections ON jss_sections.sectionId = jss_products_tree.sectionidWHERE jss_products.name LIKE "%curado%"

Pero como queremos saber sólo el número de productos que hay dentro de una sección, la sentencia queda un poco diferente

SELECT count( * ) AS totalfound, jss_sections.sectionid, jss_sections.titleFROM (jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid)INNER JOIN jss_sections ON jss_sections.sectionId = jss_products_tree.sectionidWHERE jss_products.name LIKE "%curado%"GROUP BY jss_sections.sectionid

Posted in mysql . Comentario: (0). Retroenlaces:(0). Enlace
«Next post | Previous post»

Comentarios

Deja un comentario
















El doble de 5 &eaccute;s: