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

[SOLUCIONADO] Problemilla con una SELECT

Estas en el tema de Problemilla con una SELECT en el foro de Mysql en Foros del Web. Buenas tengo un pequeño problemilla Tengo la tabla list y la tabla user_has_list, -En la tabla lista tengo unas listas tal que asi. id / ...
  #1 (permalink)  
Antiguo 20/11/2014, 06:40
nfo
 
Fecha de Ingreso: octubre-2008
Ubicación: EsPaCiO TiEmPo
Mensajes: 408
Antigüedad: 15 años, 6 meses
Puntos: 5
Problemilla con una SELECT

Buenas tengo un pequeño problemilla

Tengo la tabla list y la tabla user_has_list,
-En la tabla lista tengo unas listas tal que asi.
id / nombre
1 - Mi lista
2 - Lista 2
......
- En la tabla user_has_list
id_user / id_list
1 - 1
2 - 1
.......

Lo que quiero es contar los usuarios que tengo en cada lista
con la select que tengo me cuenta los registros bien, pero si una lista no tiene ningun usuario asociado no me muestra 0,
No se como hacerla bien.

Código SQL:
Ver original
  1. SELECT COUNT(*), l.id
  2. FROM `list` l, users_has_list uhl
  3. WHERE
  4. l.id = uhl.id_list
  5. GROUP BY l.id
[/CODE]
  #2 (permalink)  
Antiguo 20/11/2014, 06:45
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, 4 meses
Puntos: 2658
Respuesta: Problemilla con una SELECT

Cita:
Lo que quiero es contar los usuarios que tengo en cada lista
con la select que tengo me cuenta los registros bien, pero si una lista no tiene ningun usuario asociado no me muestra 0,
Porque para ese caso no puedes usar JOIN implícitos (la coma), sino explícitos. Los implícitos son funcionalmente sinónimos de INNER JOIN y lo que debes usar es un LEFT JOIN.
Código SQL:
Ver original
  1. SELECT l.id, COUNT(uhl.id_list) cant
  2. FROM `list` l LEFT JOIN users_has_list uhl ON l.id = uhl.id_list
  3. WHERE l.id_admins = 1

Y si quieres todos:
Código MySQL:
Ver original
  1. SELECT l.id, COUNT(uhl.id_list) cant
  2. FROM `list` l LEFT JOIN users_has_list uhl ON l.id = uhl.id_list
  3. WHERE 1 OR uhl.id_list IS NULL
__________________
¿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 20/11/2014, 07:06
nfo
 
Fecha de Ingreso: octubre-2008
Ubicación: EsPaCiO TiEmPo
Mensajes: 408
Antigüedad: 15 años, 6 meses
Puntos: 5
Respuesta: Problemilla con una SELECT

tampoco me funciona eso compañero
  #4 (permalink)  
Antiguo 20/11/2014, 07:08
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, 4 meses
Puntos: 2658
Respuesta: Problemilla con una SELECT

Explciate un poco mejor.
¿No te funciona en qué sentido?
¿Te da error?
Bueno eso es normal si sólo haces Copy+Paste...

Código SQL:
Ver original
  1. SELECT l.id, COUNT(uhl.id_list) cant
  2. FROM `list` l LEFT JOIN users_has_list uhl ON l.id = uhl.id_list
  3. WHERE l.id_admins = 1
  4. GROUP BY l.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)
  #5 (permalink)  
Antiguo 20/11/2014, 07:09
nfo
 
Fecha de Ingreso: octubre-2008
Ubicación: EsPaCiO TiEmPo
Mensajes: 408
Antigüedad: 15 años, 6 meses
Puntos: 5
Respuesta: Problemilla con una SELECT

Me sigue sin devolver el count = 0 cuando una lista no esta en la tabla list_has_users
  #6 (permalink)  
Antiguo 20/11/2014, 07:13
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, 4 meses
Puntos: 2658
Respuesta: Problemilla con una SELECT

Porque no has analizado en el manual cómo mfunciona el LEFT JOIN...
Cuando usas LEFT JOIN o RIGHT JOIN, el roden de las tablas altera el productro...

Código SQL:
Ver original
  1. SELECT l.id, COUNT(uhl.id_list) cant
  2. FROM users_has_list uhl LEFT JOIN `list` l ON uhl.id_list = l.id
  3. WHERE l.id_admins = 1
  4. GROUP BY uhl.id_list
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 20/11/2014, 07:18
nfo
 
Fecha de Ingreso: octubre-2008
Ubicación: EsPaCiO TiEmPo
Mensajes: 408
Antigüedad: 15 años, 6 meses
Puntos: 5
Respuesta: Problemilla con una SELECT

Fue lo primero que hice mirar el manual, pero a mi left join me sigue devolviendo el COUNT cuando es distinto de 0
  #8 (permalink)  
Antiguo 20/11/2014, 07: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, 4 meses
Puntos: 2658
LEFT JOIN devuelve todo lo que está en la primera tabla del FROM (la de la izquierda), tenga o no relacion con la segunda tabla.
En realidad nos estamos basando en un ejemplo quye tu mismo nos pasate, y que está mal...
Estás buscando los user sin lista, sobre una tabla que forzosamente debe tener relaciones con la lista, porque es la tabla que los relaciona...
Debes buscar entre la tabla de usuarios y la tabla relacional.

Código SQL:
Ver original
  1. SELECT u.id, COUNT(uhl.id_list) cant
  2. FROM users u
  3.     LEFT JOIN users_has_list uhl ON u.id = uhl.id_users
  4.    INNER JOIN `list`l ON uhl.id_list = l.id
  5. WHERE l.id_admins = 1 OR u.id = uhl.id_users IS NULL
  6. GROUP BY u.id

En esencia, la query no es posible sin tres tablas, por la restriccion de l.id_admins = 1 que estas poniendo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 20/11/2014 a las 07:26
  #9 (permalink)  
Antiguo 20/11/2014, 14:22
nfo
 
Fecha de Ingreso: octubre-2008
Ubicación: EsPaCiO TiEmPo
Mensajes: 408
Antigüedad: 15 años, 6 meses
Puntos: 5
Respuesta: Problemilla con una SELECT

gracias lo solucione con el inner join y el left join

Etiquetas: registro, 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 10:44.