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

mostrar ultimos registros teniendo en cuenta dos campos en común

Estas en el tema de mostrar ultimos registros teniendo en cuenta dos campos en común en el foro de Mysql en Foros del Web. Hola,no encuentro la lógica para recuperar registros sin tener que hacer varias consultas, intentaré explicar lo que quiero lograr, haber si me podeis ayudar. quiero ...
  #1 (permalink)  
Antiguo 14/07/2019, 14:43
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
mostrar ultimos registros teniendo en cuenta dos campos en común

Hola,no encuentro la lógica para recuperar registros sin tener que hacer varias consultas, intentaré explicar lo que quiero lograr, haber si me podeis ayudar.


quiero recuperar los últimos 50 registros de una tabla siempre y cuando cumplan varias opciones:

-registros que sean a partir de los 100 primeros.

-este recuento se debe hacer con los registros que tengan dos campos iguales.

-estos campos no importa su valor solo que deben ser iguales, debido a que existen bastantes valores diferentes.


es decir los registros tienen que ser a partir de los 100 primeros, pero este recuento se debe hacer teniendo en cuenta los que tienen dos campos iguales, es aquí mi confusión para lograrlo.
  #2 (permalink)  
Antiguo 15/07/2019, 13:17
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Nadie me puede ayudar, formulare la pregunta de otra manera para que se entienda mejor.
quiero mostrar los ultimos 50 clientes de cada pais y ciudad empezando desde el registro 100.



Código MySQL:
Ver original
  1. select * from clientes where pais='mexico' and ciudad='cancun' order by id desc limit 100,50;


Esa seria la consulta basica para un pais y ciudad en concreto, el problema está en que en la base de datos hay muchos paises y ciudades.

saludos
  #3 (permalink)  
Antiguo 15/07/2019, 16:00
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 13 años, 5 meses
Puntos: 774
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Cita:
Iniciado por pithon Ver Mensaje
Nadie me puede ayudar
Es obligacion ayudarte? Primero aprende a poner bien definida tu pregunta, y con ejemplos para que se entienda mucho mejor, en sql server podrias usar un rownumber con partition basado en el pais y la ciudad, aqui hay un ejemplo de que podrias usar, si te fijas lo hace por una sola columna en tu caso tendrias que usar 2

Ejemplo aqui
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 15/07/2019, 18:10
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 13 años, 5 meses
Puntos: 774
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Naide puede responder si le funciono la solucion o no?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 16/07/2019, 12:28
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Cita:
Iniciado por Libras Ver Mensaje
Naide puede responder si le funciono la solucion o no?
Hola, perdona no quise decir que es obligatorio ayudar, esta claro que ayuda si se puede y se quiere.
Volviendo al tema, no entiendo muy bien cómo aplicar row_number para crear mi consulta.
partiendo de esta consulta:

Código MySQL:
Ver original
  1. select * from clientes where pais='mexico' and ciudad='cancun' order by id desc limit 100,50;

me muestra los 50 registros a partir del 100, yo necesito mostrar en total 50 registros teniendo en cuenta todos los países, por ejemplo:

Código MySQL:
Ver original
  1. select * from clientes where pais='mexico' and ciudad='cancun'  limit 100,50;
Código MySQL:
Ver original
  1. select * from clientes where pais='colombia' and ciudad='bogota' limit 100,50 ;

así sucesivamente con cada país y su ciudad, aunque estas consultas están devolviendo 50 registros por cada país y como digo necesito en total 50 registros de todos los países, por orden de fecha, de id o lo que sea pero solo 50.

De todas formas estoy intentando crear la consulta, pero estoy bloqueado, cualquier ayuda se agradece.
  #6 (permalink)  
Antiguo 16/07/2019, 13:14
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 13 años, 5 meses
Puntos: 774
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Con el row_number con partition te crea registros ordenados de acuerdo a un criterio(en tu caso pais y ciudad) digamos tienes esto

Mexico cancun
Mexico cancun
Mexico cancun
Mexico cancun
Mexico Gdl
Mexico Gdl
Colombia Bogota
Colombia Bogota
Colombia Bogota


El row number con partition te regresaria lo siguiente

Mexico cancun 1
Mexico cancun 2
Mexico cancun 3
Mexico cancun 4
Mexico Gdl 1
Mexico Gdl 2
Colombia Bogota 1
Colombia Bogota 2
Colombia Bogota 3


Con eso podrias hacer un query que solo te regrese donde los valores del rownumber sean menores a 50(los primeros 50)

Se entiende?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 16/07/2019, 14:03
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Hola, el rownumber lo entiendo pero no acabo de entender cómo plantear la consulta, en cada país y ciudad quiero registros que sean a partir de los 100 primeros, es decir si la consulta del pais mexico y ciudad cancun, diera 99 registros no quiero ninguno, dicho esto aparte no quiero 50 registros de consulta de país y ciudad, quiero 50 registros en total. Este total de 50 seria los que tengan la fecha más alta.

Dicho esto, creo que tendria que usar dos condicionales uno para devolver registros a partir del registro 100 de cada país y ciudad y otra para devolver los 50 registros del total de resultados con fecha más alta.


Nose si esa es la forma de hacerlo usando rownumber, igual no se como aplicar los condicionales, voy a leer sobre el tema.

Me podrias confirmar si esa es la idea y algún ejemplo de como aplicar condiciones a dicha consulta.

gracias y saludos
  #8 (permalink)  
Antiguo 16/07/2019, 14:28
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 13 años, 5 meses
Puntos: 774
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Ahi podrias primero meter un count con un having para saber registros regresan 100 elementos algo como esto:


Código SQL:
Ver original
  1. SELECT * FROM tabla AS t1
  2. INNER JOIN
  3. (
  4.  
  5. SELECT COUNT(*) AS total, pais, ciudad FROM tabla
  6. GROUP BY pais, ciudad
  7. HAVING COUNT(*)>=100
  8. ) AS t2 ON (t1.ciudad=t2.ciudad AND t1.pais=t2.pais)

en la primer consulta podrias poner el rownumber para que te regrese los registros que necesites agrupados
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 16/07/2019, 14:34
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Cita:
Iniciado por Libras Ver Mensaje
Ahi podrias primero meter un count con un having para saber registros regresan 100 elementos algo como esto:


Código SQL:
Ver original
  1. SELECT * FROM tabla AS t1
  2. INNER JOIN
  3. (
  4.  
  5. SELECT COUNT(*) AS total, pais, ciudad FROM tabla
  6. GROUP BY pais, ciudad
  7. HAVING COUNT(*)>=100
  8. ) AS t2 ON (t1.ciudad=t2.ciudad AND t1.pais=t2.pais)

en la primer consulta podrias poner el rownumber para que te regrese los registros que necesites agrupados
Hola ahora me estoy liando , mañana me lo mirare con calma haber si acabo de entenderlo, porque ahora mismo no entiendo nada.
Gracias por tu ayuda.
saludos
  #10 (permalink)  
Antiguo 16/07/2019, 14:40
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 13 años, 5 meses
Puntos: 774
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Mira este link
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 16/07/2019, 14:53
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Cita:
Iniciado por Libras Ver Mensaje
Ah vale ahora entiendo el HAVING, pero igual ahora estoy saturado para montar la consulta mañana la intentó montar, aunque no se si podré lograrlo .
Gracias y saludos
  #12 (permalink)  
Antiguo 16/07/2019, 16:43
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

No acabo de aplicar bien el rownumber para hacer funcionar mi consulta, esto es lo que tengo hasta ahora.

Código MySQL:
Ver original
  1. SELECT * FROM clientes AS t1
  2.                 INNER JOIN
  3.                   (
  4.                   SELECT COUNT(*) AS total, pais, ciudad FROM clientes
  5.                                   WHERE estado=0
  6.                   GROUP BY pais, ciudad
  7.                   HAVING COUNT(*)>=100
  8.                   ) AS t2 ON (t1.pais=t2.pais AND t1.ciudad=t2.ciudad)
  9.                        ORDER BY fecha LIMIT 50


En la consulta actual me esta mostrando los registros agrupados por país y ciudad que tengan mas o igual a 100 registros mostrandome un total de 50 ordenados por la fecha, el problema es que los 100 primeros registros de cada agrupación de pais y ciudad no me los deberia mostrar. Es ahi donde entra en juego rownumber, pero no consigo aplicarlo a la consulta.

Sigo investigando, cualquier ayuda se agradece, saludos.
  #13 (permalink)  
Antiguo 17/07/2019, 15:33
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

no consigo hacer funcionar la consulta muestro donde me quede bloqueado, esta es la que tengo:

Código MySQL:
Ver original
  1. SELECT  
  2.                          @row_number:=CASE
  3.                          WHEN @pais = t1.pais AND @ciudad=t1.ciudad THEN @row_number + 1
  4.                          ELSE 1
  5.                          END AS num,
  6.                          @pais:=t1.pais AS P,
  7.                          @ciudad:=t1.ciudad AS C,
  8.                          fecha,
  9.                          nombre,
  10.                          id
  11.                   FROM clientes AS t1
  12.                   INNER JOIN
  13.                   (
  14.                   SELECT COUNT(*) AS total,pais,ciudad FROM clientes
  15.                   WHERE estado=0
  16.                   GROUP BY pais, ciudad
  17.                   HAVING COUNT(*)>100
  18.                   ) AS t2 ON (t1.pais=t2.pais AND t1.ciudad=t2.ciudad)
  19.                   ORDER BY date LIMIT 50

En primer lugar, no consigo incrementar en 1 la variable row_number, nunca se cumple la condición y el row_number toma el valor de 1, en los resultados se aprecia que los países y sus ciudades estan repetidos y no se porque no se cumple la condición.

Después no se como debo decirle que me recupere solo los registros a partir del 100, sería algo como mostrar registros donde la variable row_number es mayor que 100, aunque no se como aplicarlo en la consulta.
  #14 (permalink)  
Antiguo 17/07/2019, 16:10
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 13 años, 5 meses
Puntos: 774
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Prueba con esta consulta para ver lo del rownumber:

Código MySQL:
Ver original
  1.                 SELECT  
  2.                          CASE
  3.                          WHEN t1.pais = @pais AND t1.ciudad=@ciudad THEN @rownum := @rownum + 1
  4.                          ELSE @rownum := 1
  5.                          END AS num,
  6.                          @pais:= t1.pais AS P,
  7.                          @ciudad:=t1.ciudad AS C,
  8.                          fecha,
  9.                          nombre,
  10.                          id
  11.                   FROM clientes AS t1
  12.                   ) as t;
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #15 (permalink)  
Antiguo 17/07/2019, 16:41
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Cita:
Iniciado por Libras Ver Mensaje
Prueba con esta consulta para ver lo del rownumber:

Código MySQL:
Ver original
  1.                 SELECT  
  2.                          CASE
  3.                          WHEN t1.pais = @pais AND t1.ciudad=@ciudad THEN @rownum := @rownum + 1
  4.                          ELSE @rownum := 1
  5.                          END AS num,
  6.                          @pais:= t1.pais AS P,
  7.                          @ciudad:=t1.ciudad AS C,
  8.                          fecha,
  9.                          nombre,
  10.                          id
  11.                   FROM clientes AS t1
  12.                   ) as t;

Hola, probe la consulta y tampoco me incrementa el rownum.
  #16 (permalink)  
Antiguo 17/07/2019, 18:24
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Estado haciendo pruebas y el problema lo tengo con el COLLATE utf8_unicode_ci, el case no funciona si el campo no tiene ese COLLATE, como podria agregarlo.

para un campo en concreto sería fácil, algo asi:

case pais COLLATE utf8_unicode_ci.

pero al tener que usar dos campos para agrupar no se como puedo cambiar el COLLATE solo para dicha consulta.

saludos
  #17 (permalink)  
Antiguo 18/07/2019, 13:22
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

El rownumber lo hice funcionar pero solo teniendo en cuenta el pais, no se como hacerlo teniendo en cuenta tambien la ciudad.

Código MySQL:
Ver original
  1.     pais,
  2.     (
  3.         CASE pais COLLATE utf8_unicode_ci
  4.         WHEN @curPais THEN
  5.             @curRow := @curRow + 1
  6.         ELSE
  7.             @curRow := 1
  8.         AND @curPais := pais
  9.         END
  10.     ) AS totalPais
  11.     clientes t,
  12.     (
  13.         SELECT
  14.             @curRow := 0,
  15.             @curPais := ''
  16.     ) rt
  17.     pais

Tampoco encuentro la manera para que me recupere los registros a partir del 100, la variable que contiene las filas que solo recupere los que son mayores que 100.

Última edición por pithon; 18/07/2019 a las 13:40
  #18 (permalink)  
Antiguo 18/07/2019, 14:48
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Al final conseguí que funcione la consulta pero es un poco lenta.
Código MySQL:
Ver original
  1.  
  2.     pais,ciudad
  3.     (
  4.         CASE CONCAT(pais COLLATE utf8_unicode_ci,ciudad COLLATE utf8_unicode_ci)
  5.         WHEN @curInput THEN
  6.             @curRow := @curRow + 1
  7.         ELSE
  8.             @curRow := 1
  9.         AND @curInput := CONCAT(pais,ciudad)
  10.         END
  11.     ) AS row,
  12.     fecha AS f
  13.     clientes c,
  14.     (
  15.         SELECT
  16.             @curRow := 0,
  17.             @curInput := ''
  18.     ) rp
  19.     pais,ciudad
  20. ) AS t1
  21.  
  22.  
  23. (SELECT COUNT(*) AS total,pais,ciudad FROM clientes WHERE estado=1 GROUP BY pais,ciudad HAVING COUNT(*)>=100) AS t2
  24.  
  25. ON t1.pais=t2.pais AND t1.ciudad=t2.ciudad AND row>50 ORDER BY f  LIMIT 50

¿Es posible hacerlo de una manera mas eficiente, logrando el mismo resultado?

Gracias y saludos.

Última edición por pithon; 18/07/2019 a las 15:37
  #19 (permalink)  
Antiguo 18/07/2019, 15:44
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 13 años, 5 meses
Puntos: 774
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Lenta? que consideras lento? cual es tu num de registros? cual es tu plan de ejecucion? tienes indices?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #20 (permalink)  
Antiguo 18/07/2019, 16:35
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Cita:
Iniciado por Libras Ver Mensaje
Lenta? que consideras lento? cual es tu num de registros? cual es tu plan de ejecucion? tienes indices?
Tengo 1000 registros pero debe trabajar con 200.000 aumentando consideradamente su lentitud, si tengo indices.

En realidad la consulta no se ejecutar muchas veces, pero solo pregunte si es posible hacerla mas eficiente, de lo contrario la dejare asi que tampoco esta tan mal.

Gracias Libras por toda tu ayuda, saludos
  #21 (permalink)  
Antiguo 21/07/2019, 17:28
 
Fecha de Ingreso: mayo-2011
Mensajes: 1.198
Antigüedad: 8 años, 8 meses
Puntos: 10
Respuesta: mostrar ultimos registros teniendo en cuenta dos campos en común

Me esta funcionando bien la consulta pero quiero cambiar una cosa y no se como hacerlo, comento por si alguien me quiere ayudar.

las filas las numero teniendo en cuenta el pais y ciudad por ejemplo

pais
mexico
mexico
mexico
colombia
ciudad
cancun
cancun
cancun
cliente
luis
ana
marcelo
maria

quedando asi:

fila
1
2
3
1
pais
mexico
mexico
mexico
colombia
ciudad
cancun
cancun
cancun
cliente
luis
ana
marcelo
maria


como tendria que hacer para ordenar por fechas e incrementar las filas segun su pais y ciudad, quedando algo asi:

fila
3
1
2
1
fecha
29-12-2018
20-12-2018
22-12-2018
20-02-2019
pais
mexico
mexico
mexico
colombia
ciudad
cancun
cancun
cancun
cliente
luis
ana
marcelo
maria


En resumen utilizar la simulacion del rownumber para incrementar el grupo de pais y ciudad pero ordenados por fecha.
saludos

Última edición por pithon; 22/07/2019 a las 16:38

Etiquetas: campos, 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 06:36.