INNER JOIN y COUNT
ctg | 22 Febrero, 2006 23:45De 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»