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

Obtener primer registro de cada grupo

Estas en el tema de Obtener primer registro de cada grupo en el foro de Mysql en Foros del Web. Hola gente, actualmente tengo una query (algo bastante extensa) que me retorna estos resultados: id_publicidad permanencia ubicacion 41 30 7 39 30 7 40 60 ...
  #1 (permalink)  
Antiguo 27/07/2014, 11:15
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Obtener primer registro de cada grupo

Hola gente, actualmente tengo una query (algo bastante extensa) que me retorna estos resultados:
id_publicidad permanencia ubicacion
41 30 7
39 30 7
40 60 7
11 60 2
17 60 2
32 60 2
2 60 2
5 60 2
8 60 2
2 10 6
44 10 6

Lo que quiero es que retorne solo el primer resultado de cada posicion, en este caso lo quiero que retorne son las tres filas:
41 | 30 | 7
11 | 60 | 2
2 | 10 | 6

Como podria hacerlo?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #2 (permalink)  
Antiguo 27/07/2014, 13:43
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 3 meses
Puntos: 288
Respuesta: Obtener primer registro de cada grupo

hola,
si no hay un count() en elquery agregá al final:

GROUP BY ubicacion
ORDER BY <campo que determina el order> DESC;

con te agrupa por ubiacion, despues agregá el campo tiene el valor con la fecha mas actual o el ultimo id por ejemplo
  #3 (permalink)  
Antiguo 27/07/2014, 16:11
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, 5 meses
Puntos: 2658
Respuesta: Obtener primer registro de cada grupo

Poner el agrupamiento primero no funcionará si el orden ascendente es distinto.
MySQL agrupa por el primer registro encontrado, usualmente basado en PK, que en este caso sería id_publicidad, y que aplicará en forma ascendente.
Para que tome el mayor de todos, deberías ordenar primero y luego agrupar, pero no puedes hacerlo en la misma consulta porque el ORDER BY va siempre después de GROUP BY.
La solución correcta sería mas o menos:
Código MySQL:
Ver original
  1. SELECT id_publicidad, permanencia, ubicacion
  2.     (SELECT id_publicidad, permanencia, ubicacion
  3.     FROM publicidades
  4.     ORDER BY id_publicidad DESC, permanencia) Tabla
  5. GROUP BY permanencia, ubicación;

Por cierto, esta es una pregunta recurrente. Hemos dado esta solución infinidad de veces.
Te recomiendo usar el buscador del foro para estas cosas básicas.

Aqui encontrarás otras: http://www.forosdelweb.com/f86/herra...3/#post4414201
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 28/07/2014, 09:54
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Obtener primer registro de cada grupo

Hola, no, no hay count, pero no me funciono ninguno de los dos metodos, si pongo el group by como menciona Patriarka, el registro que me retorna es el del medio no el primero, es decir:
39 30 7
32 60 2
2 10 6

La de gnzaloyo retorna cualquier dato, pero eso es por los campos de agrupamiento, permanencia es una cantidad en segundos, da la casualidad que son iguales, pero pueden ser todas diferentes, ubicacion es el lugar donde se van a mostrar, y id_publicidad no es la pk de esa tabla, ya que la misma publicidad puede aparecer en varias posiciones, la pk seria id_publicidad+posicion.
Me falto aclarar esos datos en la pregunta para evitar confuciones.

Por ahora encontre como resolverlo asi:

Código MySQL:
Ver original
  1. SELECT DISTINCT info.ubicacion, info.id_publicidad, info.permanencia
  2.     FROM
  3.     (
  4.       (SELECT id_publicidad, permanencia, ubicacion
  5.        FROM
  6.        -- Esta query son 65 lineas, no es relevante para el problema
  7.        ORDER BY ubicacion ASC
  8.     ) info, (SELECT @ult_ubicacion := 0) as init
  9.     WHERE IF(@ult_ubicacion=(@ult_ubicacion:=info.ubicacion), FALSE, TRUE)

Gracias por su ayuda
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #5 (permalink)  
Antiguo 28/07/2014, 10:06
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, 5 meses
Puntos: 2658
Respuesta: Obtener primer registro de cada grupo

Cita:
Me falto aclarar esos datos en la pregunta para evitar confuciones.
Tienes que aclarar toda la información ANTES que nada. Nosotros estamos asumiendo muchas cosas com sólo la base de ejemplo que pones.

Técnicamente, el concepto que te planteaba es el usual para buscar "los más recientes de...", pero sólo es aplicable a datos concretos, y sobre un esquema de datos habitual. Tengo la impresión de que el modelo de datos que estás usando tiene algo de arbitrario.

Trata de plantear los casos reales, aportando los create table de las tablas y una meustra de datos para otra ocasión. Evitaremos suposiciones ficticias que no conducen a 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)
  #6 (permalink)  
Antiguo 31/07/2014, 02:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Obtener primer registro de cada grupo

NSD,
Creo que te han dado bien las soluciones. Yo he creado una tabla con los datos que ofreces, le puesto un PKtabla autoincrement en el orden en que los presentas, y el resultado es el esperado

Código MySQL:
Ver original
  1. SELECT id_publicidad, permanencia, ubicacion FROM tutabla  GROUP BY permanencia ORDER BY permanencia

id_publicidad permanencia ubicacion
2 10 6
41 30 7
40 60 7

No este que tú proponías
41 | 30 | 7
11 | 60 | 2
2 | 10 | 6

pues para 60 de permanencia tienes en el orden que presentas antes 40 | 60 | 7


Como te han dicho, antes de agrupar mantiene un orden por la PKtabla que puse, luego hace el agrupamiento con ese orden y finalmente ordena los datos del resultado de la agrupación por permanencia. Observa que el resultado es el esperado, pero debes tener en cuenta que el resultado del agrupamiento se hace sobre el orden del campo que es primary key. Luego los muestra ordenados según permanencia.
Prueba y nos dices.

Etiquetas: cada, grupo, primer, registro
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 04:32.