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

Obtener registros de en una tabla que almacena Logs

Estas en el tema de Obtener registros de en una tabla que almacena Logs en el foro de Bases de Datos General en Foros del Web. Hola necesito hacer una consulta en 2 tablas, una contiene la información de un usuario (id,numero de cuenta, nombre , ciudad, Genero, correo, etc) y ...
  #1 (permalink)  
Antiguo 21/08/2018, 14:57
 
Fecha de Ingreso: septiembre-2009
Mensajes: 25
Antigüedad: 15 años, 2 meses
Puntos: 3
Obtener registros de en una tabla que almacena Logs

Hola necesito hacer una consulta en 2 tablas, una contiene la información de un usuario (id,numero de cuenta, nombre , ciudad, Genero, correo, etc) y la otra es una tabla para Logs donde se almacena las secciones de un sitio que visita el usuario (id, num cuenta, sección visitada).

Los datos que se almacenan en el campo URL se guardan de la siguiente forma:
"nivel/seccion1"
"nivel/seccion2"
"nivel/seccion3"
"cuestionario/1"
"final"

Me gustaría poder hacer una consulta:
1.- Que me devuelva solo los usuarios que han visitado por ejemplo: "nivel/seccion1" y "nivel/seccion2" agrupados por ciudad y filtrados por genero
2.- El conteo de los los usuarios que han visitado por ejemplo: "nivel/seccion1" y "nivel/seccion2" agrupados por ciudad y filtrados por genero


He intentado con la siguiente consulta pero no me devuelve resultados:

<code>
SELECT COUNT(DISTINCT Usuarios.id) AS Total, Usuarios.Ciudad
FROM Usuarios
INNER JOIN Logs ON Usuarios.id = Logs.Usuarios_id
WHERE Logs.Url LIKE "%seccion1" AND Logs.Url LIKE "%seccion2"
AND Usuarios.Tipo ='M'
GROUP BY Usuarios.Ciudad;
</code>


Gracias por sus ideas

Última edición por jonn59; 21/08/2018 a las 15:37 Razón: Falto agregar información
  #2 (permalink)  
Antiguo 22/08/2018, 07:17
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obtener registros de en una tabla que almacena Logs

usa or en lugar de and

Código MySQL:
Ver original
  1. SELECT COUNT(DISTINCT Usuarios.id) AS Total, Usuarios.Ciudad
  2. FROM Usuarios
  3. INNER JOIN Logs ON Usuarios.id = Logs.Usuarios_id
  4. WHERE (Logs.Url LIKE "%seccion1" or Logs.Url LIKE "%seccion2")
  5. AND Usuarios.Tipo ='M'
  6. GROUP BY Usuarios.Ciudad;
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 22/08/2018, 11:47
 
Fecha de Ingreso: septiembre-2009
Mensajes: 25
Antigüedad: 15 años, 2 meses
Puntos: 3
Respuesta: Obtener registros de en una tabla que almacena Logs

Cita:
Iniciado por Libras Ver Mensaje
usa or en lugar de and

Código MySQL:
Ver original
  1. SELECT COUNT(DISTINCT Usuarios.id) AS Total, Usuarios.Ciudad
  2. FROM Usuarios
  3. INNER JOIN Logs ON Usuarios.id = Logs.Usuarios_id
  4. WHERE (Logs.Url LIKE "%seccion1" or Logs.Url LIKE "%seccion2")
  5. AND Usuarios.Tipo ='M'
  6. GROUP BY Usuarios.Ciudad;
Hola Libras, si pongo el operador logico OR si me devuelve resultados.
Pero según mi lógica me estaría devolviendo los que visitaron la seccion1 o la seccion2, y lo que necesito es obtener los que visitaron ambas secciones. (Por favor corrígeme si estoy mal)
  #4 (permalink)  
Antiguo 22/08/2018, 12:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obtener registros de en una tabla que almacena Logs

si asi es regresa tanto los de la 1 como los de la 2 aqui tendrias que hacer algo como esto:

Código SQL:
Ver original
  1. SELECT COUNT(DISTINCT Usuarios.id) AS Total, Usuarios.Ciudad
  2. FROM Usuarios
  3. INNER JOIN Logs ON Usuarios.id = Logs.Usuarios_id
  4. INNER JOIN Logs AS t1 ON Usuarios.id = t1.Usuarios_id
  5. WHERE Logs.Url LIKE "%seccion1" AND t1.Url LIKE "%seccion2"
  6. AND Usuarios.Tipo ='M'
  7. GROUP BY Usuarios.Ciudad;
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 22/08/2018, 14:20
 
Fecha de Ingreso: septiembre-2009
Mensajes: 25
Antigüedad: 15 años, 2 meses
Puntos: 3
Respuesta: Obtener registros de en una tabla que almacena Logs

Cita:
Iniciado por Libras Ver Mensaje
usa or en lugar de and

Código MySQL:
Ver original
  1. SELECT COUNT(DISTINCT Usuarios.id) AS Total, Usuarios.Ciudad
  2. FROM Usuarios
  3. INNER JOIN Logs ON Usuarios.id = Logs.Usuarios_id
  4. WHERE (Logs.Url LIKE "%seccion1" or Logs.Url LIKE "%seccion2")
  5. AND Usuarios.Tipo ='M'
  6. GROUP BY Usuarios.Ciudad;
Cita:
Iniciado por Libras Ver Mensaje
si asi es regresa tanto los de la 1 como los de la 2 aqui tendrias que hacer algo como esto:

Código SQL:
Ver original
  1. SELECT COUNT(DISTINCT Usuarios.id) AS Total, Usuarios.Ciudad
  2. FROM Usuarios
  3. INNER JOIN Logs ON Usuarios.id = Logs.Usuarios_id
  4. INNER JOIN Logs AS t1 ON Usuarios.id = t1.Usuarios_id
  5. WHERE Logs.Url LIKE "%seccion1" AND t1.Url LIKE "%seccion2"
  6. AND Usuarios.Tipo ='M'
  7. GROUP BY Usuarios.Ciudad;
Hola, la consulta ya me regresa el resultado, pero demora mucho (hablamos de casi 5min) la tabla de usuarios tiene 18,000 registros y la de logs 400,000.
Aun así me parece alto el tiempo de la consulta, Sobre todo si quisiera aumentar el numero de secciones a consultar. Crees que haya forma de reformular la consulta?

Última edición por jonn59; 22/08/2018 a las 14:26
  #6 (permalink)  
Antiguo 22/08/2018, 15:20
 
Fecha de Ingreso: septiembre-2009
Mensajes: 25
Antigüedad: 15 años, 2 meses
Puntos: 3
Respuesta: Obtener registros de en una tabla que almacena Logs

Código MySQL:
Ver original
  1. SELECT COUNT(DISTINCT t1.id) AS Total, t1.Ciudad
  2.     FROM Usuarios AS t1
  3.     LEFT JOIN Logs AS t2 ON t1.id = t2.Usuarios_id
  4.     LEFT JOIN Logs AS t3 ON t1.id = t3.Usuarios_id
  5.     LEFT JOIN Logs AS t4 ON t1.id = t4.Usuarios_id
  6.     LEFT JOIN Logs AS t5 ON t1.id = t5.Usuarios_id
  7.     WHERE (t2.Url = '/niveles/seccion1' AND t3.Url = '/niveles/seccion2' AND t4.Url = '/niveles/seccion3' AND t5.Url = '/niveles/seccion4')
  8.     AND t1.Tipo ='M'
  9.     GROUP BY t1.Ciudad;

Intente con la siguiente consulta siguiendo el consejo de Libras, pero el tiempo de respuesta es exageradamente largo (más de 20min) alguien tiene idea de como realizar la consulta de alguno otra forma?
  #7 (permalink)  
Antiguo 23/08/2018, 11:08
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obtener registros de en una tabla que almacena Logs

que motor de bases de datos estas usando?

podriamos hacer algo como esto:


Código SQL:
Ver original
  1. SELECT COUNT(DISTINCT t1.id) AS Total, t1.Ciudad
  2.     FROM Usuarios AS t1
  3.     LEFT JOIN (SELECT * FROM Logs WHERE url='/niveles/seccion1') AS t2 ON t1.id = t2.Usuarios_id
  4.     LEFT JOIN
  5. (SELECT * FROM Logs WHERE url='/niveles/seccion2') AS t3 ON t1.id = t3.Usuarios_id
  6.     WHERE
  7. t1.Tipo ='M'
  8.     GROUP BY t1.Ciudad;
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: logs, mysql, mysql+consulta, numero, registros, 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 17:12.