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

[SOLUCIONADO] Ordenar valores agrupados Descendientemente

Estas en el tema de Ordenar valores agrupados Descendientemente en el foro de Mysql en Foros del Web. Hola a todos de nuevo, esta vez tengo un problema el cual me ha hecho quema miles de neuronas, no creo que sea imposible, solo ...
  #1 (permalink)  
Antiguo 12/08/2014, 18:58
Avatar de ColdFusion  
Fecha de Ingreso: octubre-2008
Ubicación: Tocoa, Colon Honduras C.A.
Mensajes: 419
Antigüedad: 15 años, 5 meses
Puntos: 9
Ordenar valores agrupados Descendientemente

Hola a todos de nuevo, esta vez tengo un problema el cual me ha hecho quema miles de neuronas, no creo que sea imposible, solo que no le encuentro la solucion.

Veran, el siguiente codigo toma valores de la base de datos, concatena un campo los cuales a la vez son tomados de una agrupacion de 2 campos

Código MySQL:
Ver original
  1. SELECT *, GROUP_CONCAT(DISTINCT autor_id ORDER BY id DESC SEPARATOR ',') AS uaccionaron FROM mitabla
  2.                   WHERE destino_id=$usuario_id
  3.                   GROUP BY objetivo_id,tipo
  4.                   ORDER BY id DESC
  5.                   LIMIT 25

Ahora, el codigo funciona bien con el simple detalle de que al agrupar me devuelve el primer valor agregado y no el ultimo valor, por ejemplo

tabla

id - autor_id - destino_id - tipo
1 - 5 - 15 - 2
2 - 5 - 15 - 2
3 - 6 - 15 - 2
4 - 6 - 15 - 2
5 - 9 - 15 - 2


Devuelve:

id - autor_id - destino_id - tipo
5 - 9 - 15 - 2
3 - 6 - 15 - 2
1 - 5 - 15 - 2


Si se fijan, en los ids de los autor_id (5 y 6) devuelve el primer id y no el ultimo que este agrego, en el caso del autor_id 6 devulve 3, cuando deberia devolver 4

Espero me hayan entendido y puedan ayudarme a solucionar esto

GRACIAS!

Última edición por gnzsoloyo; 12/08/2014 a las 19:21
  #2 (permalink)  
Antiguo 13/08/2014, 01:42
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ordenar valores agrupados Descendientemente

Código MySQL:
Ver original
  1. SELECT t1.id, t1.destino_id, t1.autor_id,  t1.objetivo_id, t1.tipo FROM
  2.     (SELECT id,  destino_id, GROUP_CONCAT(DISTINCT autor_id ORDER BY id DESC SEPARATOR ',') autor_id, objetivo_id, tipo
  3.            FROM mitabla
  4.               WHERE destino_id=$usuario_id
  5.               ORDER BY id DESC)t1 GROUP BY t1.objetivo_id, t1.tipo

A ver si esto te da lo que quieres.
  #3 (permalink)  
Antiguo 13/08/2014, 14:09
Avatar de ColdFusion  
Fecha de Ingreso: octubre-2008
Ubicación: Tocoa, Colon Honduras C.A.
Mensajes: 419
Antigüedad: 15 años, 5 meses
Puntos: 9
Respuesta: Ordenar valores agrupados Descendientemente

jurena veo que el codigo que me ofreces no almacena lo concatenado en una variable, Si lo modifico a este

Código MySQL:
Ver original
  1. SELECT t1.id, t1.destino_id, t1.autor_id,  t1.objetivo_id, t1.tipo FROM
  2.     (SELECT id,  destino_id, GROUP_CONCAT(DISTINCT autor_id ORDER BY id DESC SEPARATOR ',') AS uaccionaron, autor_id, objetivo_id, tipo
  3.            FROM mitabla
  4.               WHERE destino_id=$usuario_id
  5.               ORDER BY id DESC)t1 GROUP BY t1.objetivo_id, t1.tipo

Crees que haya algun problema?
  #4 (permalink)  
Antiguo 13/08/2014, 14:46
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, 4 meses
Puntos: 2658
Respuesta: Ordenar valores agrupados Descendientemente

Cita:
jurena veo que el codigo que me ofreces no almacena lo concatenado en una variable
MySQL no entiende, escribe, ni lee variables de PHP. Sólo puede devolverte una tabla de resultados, y lo que hagas con ella ya no es dominio de MySQL.
¿Eso queda claro?

Lo que hace la query de @jurena es devolverte una columna denominada "autor_id" qe contiene los distintos valores de autor_id, separados por comas, que sería lo mismo que la tuya, con el agregado que estás poniendo otro nombre, un "AS" innecesario, y dejando separada la columna "autor_id", que te devolverá un dato inconsistente.
Si lo que quieres es ponerle otro nombre a la columna que @jurena te propone, simplemente úsalo:
Código MySQL:
Ver original
  1. SELECT t1.id, t1.destino_id, t1.autor_id,  t1.objetivo_id, t1.tipo FROM
  2.     (SELECT id,  destino_id, GROUP_CONCAT(DISTINCT autor_id ORDER BY id DESC SEPARATOR ',') uaccionaron, objetivo_id, tipo
  3.            FROM mitabla
  4.               WHERE destino_id=$usuario_id
  5.               ORDER BY id DESC)t1 GROUP BY t1.objetivo_id, t1.tipo
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 13/08/2014 a las 18:39
  #5 (permalink)  
Antiguo 13/08/2014, 17:47
Avatar de ColdFusion  
Fecha de Ingreso: octubre-2008
Ubicación: Tocoa, Colon Honduras C.A.
Mensajes: 419
Antigüedad: 15 años, 5 meses
Puntos: 9
Respuesta: Ordenar valores agrupados Descendientemente

Hola de nuevo, al parecer el codigo agrupa bien los tipos y objetivos, pero solo me muestra una agrupacion, es decir si hay varios valores en la tabla de diferentes tipos y diferentes objetivos solo me agrupa y muestra el primer grupo del primer valor insertado, el resto, al parecer, no lo agrupa o los ignora.
  #6 (permalink)  
Antiguo 14/08/2014, 07:30
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ordenar valores agrupados Descendientemente

ColdFusion,
para cada posibilidad con datos de objetivo y tipo debe aparecer un solo registro en el SELECT. Eso hace el agrupado y los datos que muestra en los otros campos, excepto en aquellos en que se use GROUP_CONCAT, son del primer registro de cada objetivo tipo en el orden descendente. Eso no quiere decir que no pueda sacarse todo, pero deberías decirnos con datos qué tienes y qué querrías mostrar.
  #7 (permalink)  
Antiguo 14/08/2014, 20:53
Avatar de ColdFusion  
Fecha de Ingreso: octubre-2008
Ubicación: Tocoa, Colon Honduras C.A.
Mensajes: 419
Antigüedad: 15 años, 5 meses
Puntos: 9
Respuesta: Ordenar valores agrupados Descendientemente

Cita:
para cada posibilidad con datos de objetivo y tipo debe aparecer un solo registro
Exacto, hasta ahi lo hace perfectamente, el problema es que solo me muestra una agrupacion de objetivo y tipo, por ejemplo.

en la bd tengo (Brevemente):

id - autor - objetivo - tipo
1 - 5 - 10 - 5
2 - 6 - 10 - 5
3 - 2 - 12 - 4
4 - 2 - 12 - 4
5 - 4 - 15 - 3

al hacer la consulta sobre la tabla anterior, deberiamos tener 3 agrupaciones de objetivo y tipo, pero solo muestra 1 agrupacion (Me doy a entender?), deberia mostrar

Resultado:
id - autor - objetivo - tipo
5 - 4 - 15 - 3
4 - 2 - 12 - 4
2 - (6,5) - 10 - 5

pero en realidad solo devuelve
id - autor - objetivo - tipo
5 - 4 - 15 - 3

Ignora o no devuelve las otras agrupaciones.

Habra algo faltando dentro del codigo de la consulta?
  #8 (permalink)  
Antiguo 15/08/2014, 01:16
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ordenar valores agrupados Descendientemente

Con los datos resulta más fácil. Prueba ahora esto. No le he puesto el where que no entiendo bien
Código MySQL:
Ver original
  1. SELECT t1.id, GROUP_CONCAT(DISTINCT t1.autor_id ORDER BY t1.id SEPARATOR ', ') uaccionaron, t1.objetivo_id, t1.tipo
  2.  FROM (SELECT id, autor_id, objetivo_id, tipo FROM `mitabla`
  3.    ORDER BY id DESC)t1 GROUP BY t1.objetivo_id, t1.tipo

Dinos qué quieres buscar en el filtro mediante WHERE para traerte el destino_id concreto y te diremos dónde colocarlo.

Última edición por jurena; 15/08/2014 a las 01:23
  #9 (permalink)  
Antiguo 15/08/2014, 06:40
Avatar de ColdFusion  
Fecha de Ingreso: octubre-2008
Ubicación: Tocoa, Colon Honduras C.A.
Mensajes: 419
Antigüedad: 15 años, 5 meses
Puntos: 9
Respuesta: Ordenar valores agrupados Descendientemente

Bien, estos datos son guardados por un autor_id para un destino_id (Seria como Yo envio, vos recibís), El codigo que deje inicialmente era para cargarlo por el usuario destino_id

Código MySQL:
Ver original
  1. WHERE destino_id=$usuario_id

Última edición por ColdFusion; 15/08/2014 a las 06:56
  #10 (permalink)  
Antiguo 15/08/2014, 07:02
Avatar de ColdFusion  
Fecha de Ingreso: octubre-2008
Ubicación: Tocoa, Colon Honduras C.A.
Mensajes: 419
Antigüedad: 15 años, 5 meses
Puntos: 9
Respuesta: Ordenar valores agrupados Descendientemente

Logre mi objetivo

Este es el codigo final:
Código MySQL:
Ver original
  1. SELECT t1.id, GROUP_CONCAT(DISTINCT t1.autor_id ORDER BY t1.id DESC SEPARATOR ', ') uaccionaron, t1.objetivo_id, t1.tipo
  2.            FROM mitabla
  3.           WHERE destino_id=$usuario_id
  4.           ORDER BY id DESC)t1 GROUP BY t1.objetivo_id, t1.tipo ORDER BY t1.id DESC;

Gracias a todos por su ayuda en especial a @jurena (¡Te lo agradezco mucho!)

Etiquetas: agrupados, campo, 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 15:30.