Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Mostrar 0 si no hay resultados

Estas en el tema de Mostrar 0 si no hay resultados en el foro de Mysql en Foros del Web. Buenas, Estoy intentando sacar un listado de usuarios que tienen productos agregados a su wishlist, para ello tengo un tabla favoritos donde voy creando entradas ...
  #1 (permalink)  
Antiguo 15/10/2012, 12:44
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Mostrar 0 si no hay resultados

Buenas,

Estoy intentando sacar un listado de usuarios que tienen productos agregados a su wishlist, para ello tengo un tabla favoritos donde voy creando entradas para cada producto que seleccione el usuario como favorito, es decir que si un usuario tiene 3 productos en su wishlist aparecen 3 registros en esa tabla que relaciona al usuario con los productos.

El tema es que hay usuarios que no tienen productos seleccionados y quiero poderlos mostrar en la consulta select con un 0. Pero cuando hago el group by no me muestra los usuarios que no tienen productos, porque como no están en la tabla favoritos no encuentra ningún valor.

Existe alguna forma de si yo hago una consulta así

Código MySQL:
Ver original
  1. SELECT user_id, count(user_id) as favoritas
  2. FROM favoritos
  3. where user_id in (1,2,3)
  4. group by user_id

Me saque por pantalla cuantos productos tiene el usuario 1, 2 y 3 aunque el 2 y el 3 no tengan productos me interesa que muestre un 0.

Es posible hacerlo?

Muchas gracias de antemano

Última edición por gnzsoloyo; 15/10/2012 a las 12:48 Razón: Etiquetar, por favor. Facilita la lectura
  #2 (permalink)  
Antiguo 15/10/2012, 12:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Mostrar 0 si no hay resultados

En realidad, lo único que tienes que hacer es seguir cfruzando las dos tablas, pero con un LEFT JOIN y no INNER JOIN.
Código MySQL:
Ver original
  1. SELECT u.user_id, COUNT(f.user_id) favoritas
  2. FROM usuarios U LEFT JOIN favoritos F ON u.user_id = F.user_id
  3. WHERE user_id IN (1,2,3)
  4. GROUP BY user_id
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 15/10/2012, 13:06
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Mostrar 0 si no hay resultados

Gracias gnzsoloyo

La versión simplificada del ejemplo me funciona.

Código SQL:
Ver original
  1. SELECT usuarios.user_id, COUNT(favoritos.user_id) AS favoritas
  2.     FROM usuarios LEFT JOIN favoritos ON usuarios.user_id = favoritos.user_id
  3.     WHERE usuarios.user_id IN (1,2,3)
  4.     GROUP BY user_id

Pero intento aplicarla a la versión real que tiene dos inners, he realizado varias pruebas con left y no doy con la clave, aquí no sirve?

Código SQL:
Ver original
  1. SELECT usuarios.user_id, apodo, avatar, COUNT(favoritos.user_id) AS wishlist FROM favoritos
  2. LEFT JOIN usuarios ON usuarios.user_id = favoritos.user_id
  3. LEFT JOIN usuarios_info ON usuarios.user_id = usuarios_info.user_id
  4. WHERE favoritos.user_id IN (1,2,3)
  5. GROUP BY user_id

Muchas gracias!
  #4 (permalink)  
Antiguo 15/10/2012, 13:13
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Mostrar 0 si no hay resultados

Nada!

Encontrada tras más pruebas

SELECT usuarios.user_id, apodo, avatar, count(favoritos.user_id) as wishlist
FROM usuarios LEFT JOIN favoritos ON usuarios.user_id = favoritos.user_id
INNER JOIN usuarios_info ON usuarios.user_id = usuarios_info.user_id
WHERE usuarios.user_id IN (1,2,3)
GROUP BY user_id

Muchas gracias ;)
  #5 (permalink)  
Antiguo 15/10/2012, 13:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Mostrar 0 si no hay resultados

Neodani:
Hay que tener bastante cuidado cuando se realizan consultas entre tablas de relaciones N:N, especialmente cuando la relación no es mandatoria (obligatoria), porque los resultados finales dependen del orden de las tablas y de los INNER y LEFT.
Cuando usas una relación así, la primer tabla tiene que ser siempre aquella donde siempre existirán datos (la que es tabla origen o padre), porque es sobre ella donde se apoyará el resultado.
Luego debes vincular esa tabla con la tabla relacional, pero siempre con LEFT JOIN, ya que en la segunda puede que existan o no registros vinculados.
La tercer tabla se debe hacer siempre por INNER JOIN (salvo algún caso excepcional), porque sólo relacionará lo que esté vinculado con la primer tabla y no sea NULL en la segunda.
Acuérdate siempre que en un JOIN, los campos NULL no se pueden igualar. Y nop pueden igualarse porque NULL no es un dato que exista, sino un estado de indeterminación. Es la nada y por lógica, significa que no existe un registro... por ende no devuelve registros.
En el caso del COUNT() aplicado a tu ejemplo, el COUNT se debe hacer sobre el campo vinculado de la tercera tabla, porque COUNT() sólo cuenta datos reales y no cuenta NULLs. Si lo aplicaras contra el id del usuario de la primera tabla, siempre devolvería al menos un uno (1).

¿Se entiende la lógica del asunto?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: registros, resultados, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:30.