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

[SOLUCIONADO] Count funciona mal al añadir un inner join

Estas en el tema de Count funciona mal al añadir un inner join en el foro de Mysql en Foros del Web. Hola, este es mi esquema de tablas http://s2.subirimagenes.com/otros/previo/thump_8614577tabla.jpg quiero obtener cuantos usuarios tiene cada post pero el resultado de la columna de total no es ...
  #1 (permalink)  
Antiguo 11/09/2013, 04:26
 
Fecha de Ingreso: septiembre-2013
Mensajes: 4
Antigüedad: 11 años, 2 meses
Puntos: 0
Count funciona mal al añadir un inner join

Hola, este es mi esquema de tablas
http://s2.subirimagenes.com/otros/previo/thump_8614577tabla.jpg
quiero obtener cuantos usuarios tiene cada post pero el resultado de la columna de total no es correcta.
Si quito inner join entre la tabla post y post_tags en esta consulta el resultado es correcto, a si que entiendo que el problema resulta de esa union, pero no entiendo el porque.

Código MySQL:
Ver original
  1. SELECT u.nombre,pu.usuarios_id,count(pu.usuarios_id) as total
  2. usuarios as u inner join
  3. (post_usuarios as pu inner join
  4. (post as p inner join post_tags as pt on
  5. p.id=pt.post_id)
  6. on pu.post_id=p.id)
  7. on u.id=pu.usuarios_id
  8.                                                                            
  9. group by pu.usuarios_id



Gracias!
  #2 (permalink)  
Antiguo 11/09/2013, 05:56
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Count funciona mal al añadir un inner join

Siendo que la relación (correctamente planteada) entre usuarios y posts, es N:N, y lo que quieres es saber la cantidad de usuarios de cada post, y no su contenido, la tabla Posts es innecesaria. Eso por lo pronto.
Por otro lado, en ese contexto, si lo que quieres saber es cuántos usuarios participaron de esos posts (o hilos, más bien, por lo que parece), lo que debes contar es cuántos usuarios diferentes hay relacionados con ese post.
O sea:
Código MySQL:
Ver original
  1. SELECT u.nombre, u.id usuarios_id, COUNT(DISTINCT u.id) total
  2. FROM usuarios as u INNER JOIN post_usuarios as pu ON on u.id=pu.usuarios_id
  3. GROUP BY pu.id;
Trata de no relacionar más tablas de las que efectivamente devolverán los datos buscados. Poner más sólo generara problemas de performance, pero no ayudará en nada.
__________________
¿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 11/09/2013, 06:15
 
Fecha de Ingreso: septiembre-2013
Mensajes: 4
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Count funciona mal al añadir un inner join

Primero que todo, muchas gracias por tu rápida respuesta, el problema que planteo es un simple ejemplo del proyecto real en el que estoy.

En realidad se trata de aplicar unos filtros a buscador, y es totalmente necesario saber, cantidad (count) de cada usuario hay de todos los post que tengan el tag x.

Por porner otro ejmplo quizás mas claro tengo un buscador de aerolíneas las tablas son :

tiposcomida 1 a n tipocomidAvion n a 1 con avion 1 a n avionServicios n a 1 Servicios

Y quiero saber cuantas veces se repite el tipo de comida por ejemplo Americana, en aviones que ofrezcan un servicio de Wifi.

Gracias de nuevo, y siento si no me expliqué correctamente al principio, quizás el caso parezca absurdo pero es necesario.

Última edición por hatry99; 11/09/2013 a las 06:43
  #4 (permalink)  
Antiguo 11/09/2013, 06:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Count funciona mal al añadir un inner join

Cita:
tiposcomida 1 a n tipocomidAvion n a 1 con avion 1 a n avionServicios n a 1 Servicios
La lógica que se sigue sigue siendo parecida, pero si tienes N tipos de comida en N tablas relacionadas, es posible que haya que crear las consultas dinámicamente, y no pensar en armar una única consulta, que no sólo será ineficiente, sino que también es probable que genere datos erróneos o totalmente innecesarios.
Es muy habitual que en los sistemas reales de las aplicaciones, las consultas sean muchas y diferentes para cada tipo de reporte buscado.
No te plantees consultas genéricas. Muy probablemente no te sirvan.
La lógica básica es la que te planteo. Ahora dime cómo la escribirías en función de lo que realmente necesitas buscar.
__________________
¿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 11/09/2013, 09:29
 
Fecha de Ingreso: septiembre-2013
Mensajes: 4
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Count funciona mal al añadir un inner join

Ok, entonces ya buscaré la mejor manera de hacerlo mediante lógica php y consultas dinámicas.

Gracias.
  #6 (permalink)  
Antiguo 11/09/2013, 09:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Count funciona mal al añadir un inner join

Me parece que no has entendido del todo.
En base a lo que te propuse, ¿cómo la escribirías tu?
__________________
¿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 12/09/2013, 00:37
 
Fecha de Ingreso: septiembre-2013
Mensajes: 4
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Count funciona mal al añadir un inner join

Hola gnzsoloyo,
Hago una consulta para obtener todos los aviones que cumplan esos tiposcomida y servicios.
Del resultado de esta consulta tengo los id 1,5,22.
Ahora para obtener la cantidad de tiposcomida que hay en esos aviones hago el siguiente sql.

Código MySQL:
Ver original
  1. SELECT tc.nombre,tc.id,count(tcr.tiposComida_id) as total
  2. tiposcomida as tc inner join tipocomidAvion as tca on tc.id=tca.tiposComida_id
  3. where tca.avion_id=1 or tca.avion_id=5 or tca.avion_id=22
  4. group by tca.tiposCocina_id

Lo mismo para servicios.

Y así ya tengo el count de todo. ¿Qué te parece?

Gracias.

Etiquetas: count, join, 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:35.