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

agrupar por campos y ordenar

Estas en el tema de agrupar por campos y ordenar en el foro de Mysql en Foros del Web. hola amigos haber si me pueden ayudar en un problemon q tengo tengo la siguiente tabla: Código PHP: id   |  usuario  |  comentarista |  fecha ...
  #1 (permalink)  
Antiguo 03/01/2012, 12:26
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 7 meses
Puntos: 0
agrupar por campos y ordenar

hola amigos haber si me pueden ayudar en un problemon q tengo
tengo la siguiente tabla:

Código PHP:
id  usuario comentaristafecha|
---------------------------------------
|  fran     laura       |  1888|
---------------------------------------
|  fran     juan        |  1999|
---------------------------------------
|  fran     juan        1996 |
---------------------------------------
|  fran     helen      2000 |
---------------------------------------
|  fran     laura       2011 |
---------------------------------------
|  pepe   laura       2011 |
---------------------------------------- 

quiero hacer una consulta a la tabla anterior para que me devuelva todos los reguistros cuyo usuario es fran, y ademas agruparlos por el comentarista y ordenarlos por la fecha de menor a mayor, osea que me devuelva algo asi

Código PHP:
-------------------------------------
|  fran   laura       |  1888|
--------------------------------------
|  fran   laura       2011 |
--------------------------------------


--------------------------------------
|  fran   juan        1996 |
--------------------------------------
|  fran   juan        |  1999|
--------------------------------------


--------------------------------------
|  fran   helen       2000 |
--------------------------------------- 

yo tengo esta consulta en la que agrupo por comentarista, pero no me sale lo que quiero
por favor me podrian hechar una mano, gracias

select comentario,fecha,comentarista,provincia
from comentarios_comuns
group by usuario,comentarista
having usuario = 'fran'
  #2 (permalink)  
Antiguo 03/01/2012, 13:33
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 2 meses
Puntos: 177
Respuesta: agrupar por campos y ordenar

Probaste con ORDER BY campo1,canpo2 ?
__________________
la la la
  #3 (permalink)  
Antiguo 03/01/2012, 13:39
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: agrupar por campos y ordenar

truman es que el group by ya nome funciona bien, que nome devuelve los campos q me interesan

Última edición por diegohugogallego; 03/01/2012 a las 15:28
  #4 (permalink)  
Antiguo 03/01/2012, 17:26
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: agrupar por campos y ordenar

Tengo la impresión de que estás confundiendo el concepto de "agrupar" visualmente los resultados de una tabla, con la operación GROUP BY de SQL. Y no son la misma cosa.
El GROUP BY se usa para hacer sumarizaciones o cálculos estadísticos, donde se realizan cálculos con conjuntos de registros en base a un campo o conjunto de campos indicados como criterio de agrupamiento, pero este agrupamiento sintetiza un X conjunto de registros en 1 sólo registro. No se usa para hacer que los registros de valores similares en ciertos campos aparezcan juntos. Para eso se usa el ORDER BY, no el GROUP BY.

En tu caso, para lograr lo que quieres, lo que debes hacer es:
Código MySQL:
Ver original
  1. SELECT comentario, fecha, comentarista, provincia
  2. FROM comentarios_comuns
  3. WHERE usuario = 'fran'
  4. ORDER BY usuario,  comentarista, fecha

Nota: HAVING no se usa para ubicar un valor dado a un campo (aunque pueda hacerlo), sino especialmente para establecer un criterio sobre campos que están afectados por funciones agregadas, o para operar con los alias de las columnas del SELECT, que no se pueden referenciar en el WHERE.
En tu caso, corresponde que uses esa comparación en el WHERE.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 04/01/2012, 02:59
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: agrupar por campos y ordenar

MUCHISIMAS GRACIAS gnzsoloyo me funciona correctamente, y gracias por tu explicacion, lo de ORDER BY me quedo claro.
Pero la verda no entendi nada de la explicacion del GROUP BY ni del HAVING

Saludos y gracias por tu tiempo

P.D: si tienes un hueco libre, podias ponerme otro ejemplo sobre GROUP BY y HAVING haber si lo entiendo (asi intentare no caer mas adelante en el mismo fallo)
  #6 (permalink)  
Antiguo 04/01/2012, 05:06
Avatar de azimutisima  
Fecha de Ingreso: mayo-2011
Mensajes: 107
Antigüedad: 13 años
Puntos: 14
Respuesta: agrupar por campos y ordenar

Mirate esto anda-> 12.10.2. Modificadores de GROUP BY

Aqui tienes la explicacion del having junto con la select... Having

No es que no lo expliquemos bien aquí (o allá), es que si ya está explicado en el manual OFICIAL de mysql al menos debes 1.ero leerlo, luego te damos las explicaciones que quieras.

Pd: Pero mira que sois vagos para buscar algo....
__________________
Si te gusto mi respuesta anímame a continuar dandome un voto.
  #7 (permalink)  
Antiguo 04/01/2012, 05:37
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: agrupar por campos y ordenar

Cita:
Pd: Pero mira que sois vagos para buscar algo....
Pasa todo el tiempo...

No te enerves ...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 04/01/2012, 07:32
Avatar de azimutisima  
Fecha de Ingreso: mayo-2011
Mensajes: 107
Antigüedad: 13 años
Puntos: 14
Respuesta: agrupar por campos y ordenar

No me enervo tranqui, tampoco voy de "listo", simplemente a veces se me ocurre dar un poco "la charla" como a los curas, solo a veces y cuando creo que es por su bien. Va a ahorrar tiempo a él y a nosotros.

Cita:
No te enerves ...
Y lo dice alguien que tiene como firma

"El problema es la interfase silla-teclado." (Gillermo Luque)

jajajaj,
__________________
Si te gusto mi respuesta anímame a continuar dandome un voto.
  #9 (permalink)  
Antiguo 04/01/2012, 14:10
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: agrupar por campos y ordenar

muchisimas gracias por los comentarios, e visto el manual y bueno algo entendi, pero aun no e conseguido hacer lo que queria
Teniendo estos registros en la BD


Código MySQL:
Ver original
  1. id  | usuario | comentarista| fecha|
  2. -------------------------------------------
  3. | 0 |  fran     | laura            |  2010|
  4. -------------------------------------------
  5. | 1 |  fran     | angel           |  1999|
  6. -------------------------------------------
  7. | 2 |  fran     | angel           |  2011 |
  8. -------------------------------------------
  9. | 3 |  fran     | helen           | 2000 |
  10. -------------------------------------------
  11. | 4 |  fran     | laura            | 2012 |
  12. -------------------------------------------
  13. | 5 |  pepe   | laura            | 2011 |
  14. -------------------------------------------
Quiero hacer una consulta que me arrogue todas filas q tenga el usuario 'fran' y ademas que me agrupe el resultado por comentarista
y ademas que muestre de primero el grupo de comentaristas con la primera fecha mas reciente
El resultado q quiero es similar a este;

Código MySQL:
Ver original
  1. -------------------------------------
  2. | 0 |  fran   | laura       |  2012 |
  3. --------------------------------------
  4. | 4 |  fran   | laura       |  2010 |
  5. --------------------------------------
  6.  
  7. --------------------------------------
  8. | 2 |  fran   | angel        | 2011 |
  9. --------------------------------------
  10. | 1 |  fran   | angel        |  1999|
  11. --------------------------------------
  12.  
  13. --------------------------------------
  14. | 3 |  fran   | helen       | 2000 |
  15. ---------------------------------------

muchas gracias de antemano, aun q ya se que es complicado, por lo menos para mi que no lo doy hecho

Última edición por diegohugogallego; 05/01/2012 a las 04:47
  #10 (permalink)  
Antiguo 05/01/2012, 16:47
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: agrupar por campos y ordenar

Código MySQL:
Ver original
  1. SELECT comentario, comentarista, fecha
  2. FROM comentarios_comuns
  3. WHERE usuario = 'fran'
  4. ORDER BY comentarista ASC, fecha DESC
El resto es programación, no BBDD.

Muchas de estas cosas se resuelven mirando lo que dice el manual. No esperes a que te demos todos los problemas resueltos: Investiga, lee el Manual, leelo con atención, los tutoriales, practica los ejemplos, no te quedes con sólo mirarlos.
Todos hicimos lo mismo.

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 06/01/2012, 03:56
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: agrupar por campos y ordenar

gracias gnzsoloyo esa consulta ya la he probado hace tiempo, pero no devulve lo q yo quiero ya que me mostraria los comentaristas por orden alfabetico (y no quiero eso si no que me muestre de primero los comentaristas que tengan la fecha mayor) , ya e mirado muchos manuales y foros pero la verda es que nada

Lo voy a tener que dejar por imposible, dejo unos cuantos ejemplos para que se vea mas claramente lo que busco




Cita:
lo que quiero

| 0 | fran | laura | 2012 | -> la fecha mas grande de primera
| 4 | fran | laura | 2010 |
---------------------------
| 2 | fran | angel | 2011 | |> que los nombres de los comentaristas salgan todos seguidos,
| 1 | fran | angel | 1999 | |> todos los angel juntos (uno a continuacion del otro)
---------------------------
| 3 | fran | helen | 2000 | |> todas las helen juntas (una a continuacion de la otra)


lo q no quiero
| 0 | fran | laura | 2012 |
| 1 | fran | angel | 1999 |
---------------------------
| 2 | fran | angel | 2011 |
| 4 | fran | laura | 2010 |
---------------------------
| 3 | fran | helen | 2000 |



lo que no quiero
| 3 | fran | helen | 2000 |
---------------------------
| 4 | fran | laura | 2010 |
| 0 | fran | laura | 2012 |
---------------------------
| 2 | fran | angel | 2011 |
| 1 | fran | angel | 1999 |

Última edición por diegohugogallego; 06/01/2012 a las 04:02
  #12 (permalink)  
Antiguo 06/01/2012, 04:23
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: agrupar por campos y ordenar

No creo que realmente la hayas probado bien, porque lo que te planteo haría precisamente que los datos aparezcan como quieres...

ORDER BY comentarista ASC, fecha DESC

Ordena primero por comentarista, a los comentaristas (cada uno) en forma ascendente, y entre si a los comentaristas por el orden de la fecha en forma descendente...

¿Estás totalmente seguro de haber probado así el ordenamiento?
__________________
¿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; 06/01/2012 a las 06:59
  #13 (permalink)  
Antiguo 06/01/2012, 09:01
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: agrupar por campos y ordenar

gnzsoloyo gracias por tu interes y persistencia pero creo q aun no te diste cuenta bien del resultado q quiero
con su consulta me sale lo siguiente


Cita:
---fran---angel--- 2011
---fran---angel--- 1999

---fran---helen--- 2000
---fran---laura----2012 -> la fecha mas grande de NOOOOO salio de primera

---fran---laura--- 2010

o sea los comentaristas estan agrupados (o sea todos los angel seguidos, todas las lauras seguidas y las helen tambien) bien y asta hay es lo que busco.

El problemas es que asi los comentaristas saldrian siempre ordenados alfebeticamente, q es lo que NO QUIERO.
Lo que QUIERO es que el grupo de comentarista con la fecha mayor salgan de primeros tal y como esa en el ejemplo



Cita:
lo que quiero

| 0 | fran | laura | 2012 | -> la fecha mas grande de primera
| 4 | fran | laura | 2010 |
---------------------------
| 2 | fran | angel | 2011 | |> que los nombres de los comentaristas salgan todos seguidos,
| 1 | fran | angel | 1999 | |> todos los angel juntos (uno a continuacion del otro)
---------------------------
| 3 | fran | helen | 2000 | |> todas las helen juntas (una a continuacion de la otra)
  #14 (permalink)  
Antiguo 06/01/2012, 09: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: agrupar por campos y ordenar

Cita:
Lo que QUIERO es que el grupo de comentarista con la fecha mayor salgan de primeros tal y como esa en el ejemplo
Entonces ordena primero por fecha descendente y luego por comentarista en forma ascendente...


El problema es que tienes que decidir qué quieres agrupar primero: Si los comentaristas o las fechas.
Si lo haces por ellos, las fechas se entremezclarán, ya que los mensajes se corresponderán con ls comentaristas. Si lo haces por las fechas, se agruparan fechas y mezclaran comentaristas...
Los criterios son mutuamente excluyentes.

decide qué quieres jerarquizar.

Pregunta: ¿ Qué tipo de columna usas para esa fecha?
__________________
¿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; 06/01/2012 a las 09:45
  #15 (permalink)  
Antiguo 06/01/2012, 10:51
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: agrupar por campos y ordenar

Hola compañeros:

La solución no es tan trivial como propone el compañero gnzsoloyo... si entendí correctamente con sólo ORDER BY no se puede obtener el resultado que quiere diegohugogallego:

Si ordenas por comentarista y fecha obtienes

Código MySQL:
Ver original
  1. mysql> SELECT usuario, comentarista, fecha
  2.     -> FROM tabla
  3.     -> WHERE usuario = 'fran'
  4.     -> ORDER BY comentarista ASC, fecha DESC;
  5. +---------+--------------+-------+
  6. | usuario | comentarista | fecha |
  7. +---------+--------------+-------+
  8. | fran    | angel        |  2011 |
  9. | fran    | angel        |  1999 |
  10. | fran    | helen        |  2000 |
  11. | fran    | laura        |  2012 |
  12. | fran    | laura        |  2010 |
  13. +---------+--------------+-------+
  14. 5 rows in set (0.00 sec)

El problema es que el primer registro NO CORRESPONDE A LA FECHA MÁXIMA.

Si ordenas primero por fecha y comentarista obtienes:

Código MySQL:
Ver original
  1. mysql> SELECT usuario, comentarista, fecha
  2.     -> FROM tabla
  3.     -> WHERE usuario = 'fran'
  4.     -> ORDER BY fecha DESC, comentarista;
  5. +---------+--------------+-------+
  6. | usuario | comentarista | fecha |
  7. +---------+--------------+-------+
  8. | fran    | laura        |  2012 |
  9. | fran    | angel        |  2011 |
  10. | fran    | laura        |  2010 |
  11. | fran    | helen        |  2000 |
  12. | fran    | angel        |  1999 |
  13. +---------+--------------+-------+
  14. 5 rows in set (0.02 sec)

El problema es que los registros NO QUEDAN AGRUPADOS POR COMENTARISTA.

La solución que encontré no es del todo sencilla, pero creo que puede funcionar.

Código MySQL:
Ver original
  1. mysql> SET @num = 0;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT T2.usuario, t2.comentarista, t2.fecha FROM
  5.     -> (
  6.     -> SELECT MAX(fecha) fecha, usuario, comentarista,
  7.     -> @num := @num + 1 AS row_number
  8.     -> FROM tabla
  9.     -> WHERE usuario = 'fran'
  10.     -> GROUP BY usuario, comentarista
  11.     -> ORDER BY fecha DESC) T1 INNER JOIN
  12.     -> (
  13.     -> SELECT usuario, o.comentarista, o.fecha,
  14.     -> FIND_IN_SET( o.fecha ,
  15.     -> ( SELECT GROUP_CONCAT(fecha ORDER BY fecha DESC)
  16.     -> FROM tabla i
  17.     -> WHERE i.comentarista = o.comentarista AND i.usuario = o.usuario)
  18.     -> ) AS row_number_2 FROM tabla o
  19.     -> WHERE usuario = 'fran'
  20.     -> ORDER BY comentarista, row_number_2) T2
  21.     -> ON T1.usuario = T2.usuario AND T1.comentarista = T2.comentarista
  22.     -> ORDER BY T1.row_number, T2.row_number_2;
  23. +---------+--------------+-------+
  24. | usuario | comentarista | fecha |
  25. +---------+--------------+-------+
  26. | fran    | laura        |  2012 |
  27. | fran    | laura        |  2010 |
  28. | fran    | angel        |  2011 |
  29. | fran    | angel        |  1999 |
  30. | fran    | helen        |  2000 |
  31. +---------+--------------+-------+
  32. 5 rows in set (0.06 sec)

La consulta se conforma de dos subconsultas, la primera para determinar el orden en que deben presentarse los comentarista DE ACUERDO AL MÁXIMO AÑO QUE TENGAN ASIGNADO, es decir, algo como esto:

Código MySQL:
Ver original
  1. mysql> SET @num = 0;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT MAX(fecha) fecha, usuario, comentarista,
  5.     -> @num := @num + 1 AS row_number
  6.     -> FROM tabla
  7.     -> WHERE usuario = 'fran'
  8.     -> GROUP BY usuario, comentarista
  9.     -> ORDER BY fecha DESC;
  10. +-------+---------+--------------+------------+
  11. | fecha | usuario | comentarista | row_number |
  12. +-------+---------+--------------+------------+
  13. |  2012 | fran    | laura        |          1 |
  14. |  2011 | fran    | angel        |          2 |
  15. |  2000 | fran    | helen        |          3 |
  16. +-------+---------+--------------+------------+
  17. 3 rows in set (0.00 sec)

La segunda parte es para determinar el orden en que deben presentarse los registros para cada comentarista DE ACUERDO A LA FECHA, es decir:

Código MySQL:
Ver original
  1. mysql> SELECT usuario, o.comentarista, o.fecha,
  2.     -> FIND_IN_SET( o.fecha ,
  3.     -> ( SELECT GROUP_CONCAT(fecha ORDER BY fecha DESC)
  4.     -> FROM tabla i
  5.     -> WHERE i.comentarista = o.comentarista AND i.usuario = o.usuario)
  6.     -> ) AS row_number_2 FROM tabla o
  7.     -> WHERE usuario = 'fran'
  8.     -> ORDER BY comentarista, row_number_2;
  9. +---------+--------------+-------+--------------+
  10. | usuario | comentarista | fecha | row_number_2 |
  11. +---------+--------------+-------+--------------+
  12. | fran    | angel        |  2011 |            1 |
  13. | fran    | angel        |  1999 |            2 |
  14. | fran    | helen        |  2000 |            1 |
  15. | fran    | laura        |  2012 |            1 |
  16. | fran    | laura        |  2010 |            2 |
  17. +---------+--------------+-------+--------------+
  18. 5 rows in set (0.02 sec)

Finalmente haces la unión de ambas partes y ordenas por los campos row_number que obtuviste en casa subconsulta.

Igual y no es la forma más óptima de hacer la consulta, si encuentro alguna otra forma más fácil de hacerlo la posteo.

Saludos y espero que te sirva el código.
Leo
  #16 (permalink)  
Antiguo 06/01/2012, 12:35
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: agrupar por campos y ordenar

Bueno bueno bueno me dejaste alucinando leonardo_josue
En mi vida habria llegado a esa consulta
He provado tu consulta (aun que me costo aplicarla, no por ti, sino por mi ya q no tengo un nivel tan alto en Mysql)


A qui te muestro el resultado q me dio ami
solo decirte que angel tendria q ir primero que helen ya que tiene la fecha con el numero mas alto


Cita:
mi resultado
---fran---laura---2012
---fran---laura---2010
---fran---helen---2000
---fran---angel---2011
---fran---angel---1999
solo preguntarte que si es fallo mio o algo, ya que tu tienes el resultado perfecto, tal como lo quiero yo

tu resultado
Código SQL:
Ver original
  1. +---------+------------------+-------+
  2. | usuario | comentarista | fecha |
  3. +---------+------------------+-------+
  4. | fran     | laura               |  2012 |
  5. | fran    | laura                |  2010 |
  6. | fran    | angel               |  2011 |
  7. | fran    | angel               |  1999 |
  8. | fran    | helen               |  2000 |
  9. +---------+------------------+-------+

muchisimas gracias me fuiste de gran ayuda
  #17 (permalink)  
Antiguo 06/01/2012, 13:24
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: agrupar por campos y ordenar

Hola de nuevo...

Me da gusto ver que creo que te ha servido la consulta, mira, el orden en que deben aparecer los comentaristas está dado por esta consulta;

Código:
SET @num = 0;
SELECT MAX(fecha) fecha, usuario, comentarista,
@num := @num + 1 AS row_number
FROM tabla
WHERE usuario = 'fran'
GROUP BY usuario, comentarista
ORDER BY fecha DESC; 


Verifica que no hayas omitido la parte del ORDER BY, que es justamente lo que hace que Angel deba ir antes Helen...

Esta consulta debería regresarte algo como esto:

Código MySQL:
Ver original
  1. +-------+---------+--------------+------------+
  2. | fecha | usuario | comentarista | row_number |
  3. +-------+---------+--------------+------------+
  4. |  2012 | fran    | laura        |          1 |
  5. |  2011 | fran    | angel        |          2 |
  6. |  2000 | fran    | helen        |          3 |
  7. +-------+---------+--------------+------------+

es decir, el año Máximo para cada comentarista y la posición (row_number) en la que debería aparecer... creo que por ahí puede estar el error... Observa que hay tres ORDER BY en la consulta, uno para cada subconsulta y uno para la consulta final.

Saludos
Leo.
  #18 (permalink)  
Antiguo 06/01/2012, 14:48
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: agrupar por campos y ordenar

pues no entiendo la verda en que fallo, por que ya haciendo parte de la consulta como propones a mi me da un resultado distinto



Código MySQL:
Ver original
  1. SET @num = 0;
  2.      
  3.                    
  4.             SELECT MAX(fecha) fecha, usuario, comentarista,
  5.      @num := @num + 1 AS row_number
  6.      FROM comentarios_comuns
  7.     WHERE usuario = 'fran'
  8.      GROUP BY usuario, comentarista
  9.     ORDER BY fecha DESC



Código PHP:
Ver original
  1. fecha   usuario     comentarista    row_number
  2. 2012    fran    laura               1
  3. 2011    fran    angel               3    <---------  me sale en distinto lugar que a ti
  4. 2000    fran    helen               2




bueno te remito tambien la consulta total por si le quieres hechar un vistazo, pero yo pienso q esta todo en orden




Código SQL:
Ver original
  1. SET @num = 0;
  2.      
  3.                    
  4. SELECT T2.usuario, T2.comentarista, T2.fecha FROM (
  5.      
  6.      SELECT MAX(fecha) fecha, usuario, comentarista,
  7.      @num := @num + 1 AS ROW_NUMBER
  8.      FROM comentarios_comuns
  9.      WHERE usuario = 'fran'
  10.      GROUP BY usuario, comentarista
  11.     ORDER BY fecha DESC)
  12.    
  13.     T1 INNER JOIN(
  14.    
  15.     SELECT usuario, o.comentarista, o.fecha,
  16.      FIND_IN_SET( o.fecha ,
  17.      ( SELECT GROUP_CONCAT(fecha ORDER BY fecha DESC)
  18.      FROM comentarios_comuns i
  19.     WHERE i.comentarista = o.comentarista AND i.usuario = o.usuario)
  20.      ) AS row_number_2 FROM comentarios_comuns o
  21.      WHERE usuario = 'fran'
  22.      ORDER BY comentarista, row_number_2)
  23.      
  24.     T2
  25.     ON T1.usuario = T2.usuario AND T1.comentarista = T2.comentarista
  26.      ORDER BY T1.ROW_NUMBER, T2.row_number_2

Última edición por diegohugogallego; 06/01/2012 a las 14:55
  #19 (permalink)  
Antiguo 06/01/2012, 15:06
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: agrupar por campos y ordenar

Hola de Nuevo...

Es bastante raro... la consulta es la misma, lo único que se me ocurre es el tipo de dato de tu campo fecha... no nos hay comentado de qué tipo es... cualquier tipo numérico no debería tener problemas... pero si es tipo caracter habría que hacer la conversión, pues la ordenación de cadenas es diferente a la de números...

Si no es eso, sinceramente no sé que más podría ser... esta consulta es básica si tu haces esto

Código MySQL:
Ver original
  1. select distinct fecha from tabla order by fecha desc

de debería regresar la lista de los años ordenados de manera descendente, verificalo y nos comentas.

Saludos
Leo.
  #20 (permalink)  
Antiguo 06/01/2012, 15:19
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: agrupar por campos y ordenar

leonardo_josue si asi me muestra las fechas correctamente

2012,2011,2010,2000,1999

es que lo que parece que no asigna bien es el campo row_number y no se porque
te comento, todos los datos de la tabla son de tipo varchar
mira te paso la tabla tal y como la tengo haber si sale asi el fallo
esta muy pobre en datos puesto qeu meti algunos valores para porbar pero visto lo visto no se si sera mejor arrojar la toalla q se ve q es bastante complicada la cosa



Código SQL:
Ver original
  1. -- Estructura de tabla para la tabla `comentarios_comuns`
  2. --
  3.  
  4. CREATE TABLE `comentarios_comuns` (
  5.   `id` VARCHAR(30) COLLATE utf8_spanish2_ci NOT NULL,
  6.   `usuario` VARCHAR(20) COLLATE utf8_spanish2_ci NOT NULL,
  7.   `comentario` VARCHAR(200) COLLATE utf8_spanish2_ci NOT NULL,
  8.   `fecha` VARCHAR(20) COLLATE utf8_spanish2_ci NOT NULL,
  9.   `comentarista` VARCHAR(20) COLLATE utf8_spanish2_ci NOT NULL,
  10.   `provincia` VARCHAR(20) COLLATE utf8_spanish2_ci NOT NULL,
  11.   `leido` VARCHAR(1) COLLATE utf8_spanish2_ci NOT NULL,
  12.   `respuesta` VARCHAR(1) COLLATE utf8_spanish2_ci DEFAULT NULL,
  13.   PRIMARY KEY (`id`)
  14. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci;
  15.  
  16. --
  17. -- Volcar la base de datos para la tabla `comentarios_comuns`
  18. --
  19.  
  20. INSERT INTO `comentarios_comuns` (`id`, `usuario`, `comentario`, `fecha`, `comentarista`, `provincia`, `leido`, `respuesta`) VALUES
  21. ('5', 'pepe', 'hola ', '2011', 'laura', 'zas', 'S', ''),
  22. ('4', 'fran', 'hola ', '2012', 'laura', 'zas', 'S', ''),
  23. ('3', 'fran', 'hola ', '2000', 'helen', 'zas', 'S', ''),
  24. ('2', 'fran', 'hola ', '2011', 'angel', 'zas', 'S', ''),
  25. ('1', 'fran', 'hola ', '1999', 'angel', 'Coruña', 'N', ''),
  26. ('0', 'fran', 'hla  ', '2010', 'laura', 'Coruña', 'N', '');

muchisimas gracias leonardo_josue por tu tiempo e interes

P.D: acabo de cambiarle el tipo de dato a fecha (de varchar a year), por si las moscas, pero nada sigue saliendo mal el orden igual

Última edición por diegohugogallego; 06/01/2012 a las 15:47
  #21 (permalink)  
Antiguo 06/01/2012, 16:14
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: agrupar por campos y ordenar

Hola de nuevo...

Ya di con el error, pero es bastante raro... el problema es que la asignación del row_number la hace antes de ordenar... prueba así:

Código MySQL:
Ver original
  1. mysql> SELECT fecha, usuario, comentarista,
  2.     -> @num := @num + 1 AS row_number FROM
  3.     -> (SELECT MAX(fecha) fecha, usuario, comentarista
  4.     -> FROM `comentarios_comuns`
  5.     -> WHERE usuario = 'fran'
  6.     -> GROUP BY usuario, comentarista
  7.     -> ORDER BY fecha DESC) T1;
  8. +-------+---------+--------------+------------+
  9. | fecha | usuario | comentarista | row_number |
  10. +-------+---------+--------------+------------+
  11. | 2012  | fran    | laura        |          1 |
  12. | 2011  | fran    | angel        |          2 |
  13. | 2000  | fran    | helen        |          3 |
  14. +-------+---------+--------------+------------+
  15. 3 rows in set (0.03 sec)

No tengo idea de por qué hace esto... pero en fin... también podrías buscar otras técnicas para enumerar registro, la idea es simplemente que agregue una secuencia 1,2,3, [...], n para cada registro, esta es sólo una de forma de hacerlo, pero hay muchas más.

Finalmente, no es recomendable que utilices sólo campos varchar en tu tabla pues además de ser un verdadero desperdicio de memoria también implica tener que hacer validaciones extras... pues tendrías que verificar por código que por ejemplo no se captures caracteres en tu campo fecha... En lugar de eso elige el tipo de dato adecuado, te quitarás de muchos problemas.

Saludos
Leo.
  #22 (permalink)  
Antiguo 06/01/2012, 16:41
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: agrupar por campos y ordenar

perdon ppor molestarte otra vez, he probado tu consulta y va perfectamente
Lo malo es que no doy hecho la union
hize de la siguiente manera pero me da error me dice que el campo fecha es ambiguo


Código SQL:
Ver original
  1. SET @num = 0;
  2.          
  3.                        
  4.        SELECT fecha, usuario, comentarista,
  5.      @num := @num + 1 AS ROW_NUMBER FROM(
  6.      SELECT MAX(fecha) fecha, usuario, comentarista
  7.      FROM comentarios_comuns
  8.      WHERE usuario = 'fran'
  9.      GROUP BY usuario, comentarista
  10.      ORDER BY fecha DESC) T1
  11.  
  12.  
  13.  
  14. INNER JOIN(
  15.        
  16.         SELECT usuario, o.comentarista, o.fecha,
  17.          FIND_IN_SET( o.fecha ,
  18.          ( SELECT GROUP_CONCAT(fecha ORDER BY fecha DESC)
  19.          FROM comentarios_comuns i
  20.         WHERE i.comentarista = o.comentarista AND i.usuario = o.usuario)
  21.          ) AS row_number_2 FROM comentarios_comuns o
  22.          WHERE usuario = 'fran'
  23.          ORDER BY comentarista, row_number_2)
  24.          
  25.         T2
  26.         ON T1.usuario = T2.usuario AND T1.comentarista = T2.comentarista
  27.          ORDER BY T1.ROW_NUMBER, T2.row_number_2
  #23 (permalink)  
Antiguo 09/01/2012, 16:29
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: agrupar por campos y ordenar

El error de columna ambiguo es bastante común cuando utilizas subconsultas, me sorprende que no hayas dado con la respuesta. San Google seguramente te hubiera podido ayudar, era cuestión de preguntar...

En lugar de poner sólo los campos, pon el nombre de la tabla o el alias que estés utilizando (i, o, T1, T2, etc) junto el nombre del campo en cuestión (T1.fecha, T2.comentarista, etc)

Saludos
Leo.
  #24 (permalink)  
Antiguo 11/01/2012, 02:48
Avatar de azimutisima  
Fecha de Ingreso: mayo-2011
Mensajes: 107
Antigüedad: 13 años
Puntos: 14
Respuesta: agrupar por campos y ordenar

Cita:
Iniciado por leonardo_josue Ver Mensaje
El error de columna ambiguo es bastante común cuando utilizas subconsultas, me sorprende que no hayas dado con la respuesta.
.
No te sorprendas, yo ya no lo hago.

Por si acaso se te olvido te recuerdo una vez más ->
Cita:
Iniciado por gnzsoloyo Ver Mensaje

Muchas de estas cosas se resuelven mirando lo que dice el manual. No esperes a que te demos todos los problemas resueltos: Investiga, lee el Manual, leelo con atención, los tutoriales, practica los ejemplos, no te quedes con sólo mirarlos.
Todos hicimos lo mismo.

__________________
Si te gusto mi respuesta anímame a continuar dandome un voto.
  #25 (permalink)  
Antiguo 11/01/2012, 05:20
 
Fecha de Ingreso: septiembre-2011
Ubicación: España
Mensajes: 118
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: agrupar por campos y ordenar

leonardo_josue lo siento pero aqui estoy de nuevo, si despues de dejarte el comentario (al hacer otra consulta a dos tablas diferentes) me di cuenta q lo de ambiguo era por culpa de los alias pero aun asi no doy hecho que funcione la consulta, o bueno si que funcione pero no q arroge el resultado esperado

Tal vez sea culpa mia que asigne mal los alias, te dejo la consulta por si le quieres hechar un vistazo y encuantras el fallo



Código SQL:
Ver original
  1. SELECT T2.fecha, T2.usuario, T2.comentarista, @num := @num + 1 AS ROW_NUMBER  FROM(
  2.      
  3.      SELECT MAX(fecha), fecha, usuario, comentarista
  4.      
  5.      FROM comentarios_comuns
  6.      WHERE usuario = 'fran'
  7.      GROUP BY usuario, comentarista
  8.     ORDER BY fecha DESC)
  9.    
  10.     T1 INNER JOIN(
  11.    
  12.     SELECT o.usuario, o.comentarista, o.fecha,
  13.      FIND_IN_SET( o.fecha ,
  14.  
  15.      ( SELECT GROUP_CONCAT(i.fecha ORDER BY i.fecha DESC)
  16.        FROM comentarios_comuns i
  17.        WHERE i.comentarista = o.comentarista AND i.usuario = o.usuario)
  18.  
  19.      ) AS row_number_2
  20.        FROM comentarios_comuns o
  21.        WHERE o.usuario = 'fran'
  22.        ORDER BY o.comentarista, row_number_2)
  23.      
  24.     T2
  25.     ON T1.usuario = T2.usuario AND T1.comentarista = T2.comentarista
  26.      ORDER BY ROW_NUMBER, T2.row_number_2


Este es el resultado q me arroga


Código SQL:
Ver original
  1. fecha   usuario     comentarista    ROW_NUMBER
  2. 2011    fran               angel             1
  3. 1999    fran               angel             2
  4. 2000    fran               helen             3
  5. 2012    fran               laura              4
  6. 2010    fran               laura              5

Etiquetas: agrupar, campos, 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 17:08.