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

Estadísticas, COUNT con JOIN o subconsulta

Estas en el tema de Estadísticas, COUNT con JOIN o subconsulta en el foro de Mysql en Foros del Web. Hola, soy Javi... me he registrado aquí porque creo que es el lugar más adecuado para preguntar y si puedo ayudar en algo lo haré. ...
  #1 (permalink)  
Antiguo 25/05/2012, 08:39
 
Fecha de Ingreso: mayo-2012
Ubicación: En mi casa
Mensajes: 22
Antigüedad: 11 años, 11 meses
Puntos: 1
Estadísticas, COUNT con JOIN o subconsulta

Hola, soy Javi... me he registrado aquí porque creo que es el lugar más adecuado para preguntar y si puedo ayudar en algo lo haré. Tengo un proyecto en el que existen estadísticas totales, y en perfiles de usuarios. Se cuentan los temas que ha creado, las descargas que ha realizado, las fotos que ha subido y estados del perfil que tiene, además obtiene información extra de dos tablas, que son los créditos y el rango del usuario. En las totales se cuentan todos los contenidos de todos los usuarios y se condiciona que el contenido sea visible y pertenezca a una cuenta no suspendida y activada. Para ello, tengo dos consultas, una basada en subqueries y la otra con el uso de join.

Perfiles con JOIN:

Código MySQL:
Ver original
  1. SELECT u.rango, u.creditos, r.nombre, COUNT(DISTINCT t.id) AS temas_usuario, COUNT(DISTINCT d.id) AS descargas_usuario, COUNT(DISTINCT f.id) AS fotos_usuario, COUNT(DISTINCT e.id) AS estados_usuario FROM usuarios AS u LEFT JOIN rangos AS r ON  u.rango = r.id LEFT JOIN temas AS t ON u.id = t.autor  && t.status = '0' LEFT JOIN downloads AS d ON u.id = d.autor LEFT JOIN fotos AS f ON  u.id = f.autor && f.status = '0' LEFT JOIN estados AS e ON u.id = e.autor && e.status = '0'  WHERE u.id = '1'

Totales con JOIN:

Código MySQL:
Ver original
  1. SELECT COUNT(DISTINCT u.id) AS usuarios_totales, COUNT(DISTINCT t.id) AS temas_totales, COUNT(DISTINCT d.id) AS desgargas_totales, COUNT(DISTINCT f.id) AS fotos_totales, COUNT(DISTINCT e.id) AS estados_totales FROM usuarios AS u LEFT JOIN temas AS t ON u.id = t.autor && t.status = '0' LEFT JOIN downloads AS d ON u.id = d.autor && d.status = '0' LEFT JOIN fotos AS f ON u.id = f.autor && f.status = '0' LEFT JOIN estados AS e ON u.id = e.autor WHERE u.activado = '1' && u.baneado = '0'

Ahora tengo dos usando subqueries, una de ellas contiene JOIN

Código MySQL:
Ver original
  1. SELECT (SELECT count(id) FROM u_miembros WHERE activado = '1' AND baneado = '0') AS usuarios_totales, (SELECT count(id) FROM temas AS t LEFT JOIN usuarios AS u ON t.autor = u.id WHERE t.status = '0' && u.activado = '1' AND u.baneado = '0') as temas_totales, (SELECT count(id) FROM descargas AS d LEFT JOIN usuarios AS u ON d.autor = u.id WHERE t.status = '0' AND u.activado = '1' AND u.baneado = '0') as descargas_totales [...]

Y la otra, sin el uso de JOIN:

Código MySQL:
Ver original
  1. SELECT * FROM (SELECT COUNT(id) AS usuarios_totales FROM usuarios WHERE activado = '1' && baneado = '0') AS ut, (SELECT COUNT(id) AS temas_totales FROM temas WHERE autor IN (SELECT id FROM usuarios WHERE activado = '1' && baneado = '0') && status = '0') AS tt, (SELECT COUNT(id) AS descargas_totales FROM descargas WHERE autor IN (SELECT id FROM usuarios WHERE activado = '1' && baneado = '0') && status = '0') AS dt, (SELECT COUNT(id) AS fotos_totales FROM fotos WHERE autor IN (SELECT id FROM usuarios WHERE activado = '1' && baneado = '0') && status = '0') AS ft, (SELECT COUNT(id) AS estados_totales FROM estados WHERE autor IN (SELECT id FROM usuarios WHERE activado = '1' && baneado = '0')) AS dt;

Todas devuelven la misma cantidad, pero no estoy seguro de cuál sea la más óptima en cada caso, ¿alguien puede orientarme?
  #2 (permalink)  
Antiguo 25/05/2012, 18:00
Avatar de djaevi  
Fecha de Ingreso: marzo-2007
Ubicación: Moreno, Buenos Aires
Mensajes: 400
Antigüedad: 17 años, 1 mes
Puntos: 47
Respuesta: Estadísticas, COUNT con JOIN o subconsulta

La sugerencia que podria hacerte es que veo que en ninguna consulta no has usado GROUP BY cuando haces tantas selecciones de cuentas no estaria mal que investigues dicha sentencia, por otro lado no entiendo porque no pones activado y baneado en un solo campo, si activado es 1 es usuario activo y si es 0 se entiende que es banneado.

Saludos
  #3 (permalink)  
Antiguo 27/05/2012, 06:42
 
Fecha de Ingreso: mayo-2012
Ubicación: En mi casa
Mensajes: 22
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: Estadísticas, COUNT con JOIN o subconsulta

Cita:
Iniciado por djaevi Ver Mensaje
La sugerencia que podria hacerte es que veo que en ninguna consulta no has usado GROUP BY cuando haces tantas selecciones de cuentas no estaria mal que investigues dicha sentencia, por otro lado no entiendo porque no pones activado y baneado en un solo campo, si activado es 1 es usuario activo y si es 0 se entiende que es banneado.

Saludos
Porque no pretendo ordenar por grupos, son cosas distintas y no hay ni dos tablas de lo mismo. Activado significa que la cuenta se ha activado por correo electrónico. Y baneado significa que está suspendido o no.
  #4 (permalink)  
Antiguo 27/05/2012, 22:10
Avatar de djaevi  
Fecha de Ingreso: marzo-2007
Ubicación: Moreno, Buenos Aires
Mensajes: 400
Antigüedad: 17 años, 1 mes
Puntos: 47
Respuesta: Estadísticas, COUNT con JOIN o subconsulta

el group by es para agrupar segun usuario los resultados que obtienes asi te lo muestra todo en un solo registro ej:

idUsuario l n_descargas l n_temas l n_descargas l n_fotos
1 l 10 l 17 l11 l 11
2 l 11 l 14 l13 l 14
3 l 12 l 17 l15 l 11
4 l 13 l 13 l16 l 17

Etiquetas: count, join, subconsulta, subquery
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 18:32.