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

Ordenar consulta sql. Simple ?

Estas en el tema de Ordenar consulta sql. Simple ? en el foro de Mysql en Foros del Web. Buenas tardes. Realmente les agradezco me puedan ayudar, pues parece ser una consulta SQL sencilla, pero no me devuelve los valores correctos. Les cuento : ...
  #1 (permalink)  
Antiguo 01/11/2012, 11:25
 
Fecha de Ingreso: mayo-2007
Mensajes: 7
Antigüedad: 16 años, 10 meses
Puntos: 0
Ordenar consulta sql. Simple ?

Buenas tardes. Realmente les agradezco me puedan ayudar, pues parece ser una consulta SQL sencilla, pero no me devuelve los valores correctos.

Les cuento : tengo un club, donde cada administrador ingresa noticias. Quiero mostrar sólo la última noticia de cada administrador, y ordenarlas de tal forma que empiece por la última ingresada ... sin importar cual sea el administrador.

En realidad lo ordena bien (por id_noti DESC), pero no muestra la última noticia de cada administrador, sino una noticia ingresada antes.

Este es el código :

Código SQL:
Ver original
  1. SELECT n.id_noti, n.noti, a.nombre FROM noticias n, admin a WHERE n.id_admin = a.id_admin GROUP BY n.id_admin ORDER BY n.id_noti DESC

Mil gracias a quién me pueda ayudar.
Un abrazo !!
  #2 (permalink)  
Antiguo 01/11/2012, 12:00
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Ordenar consulta sql. Simple ?

Hola manya:

Esta consulta es una de las que más hemos tratado en este foro... te recomiendo que para futuras ocasiones utilices la herramienta de búsqueda del foro y trates de encontrar algún otro post donde se haya tratado un tema similar...

No das información acerca de la estructura de tus tablas lo cual es un problema... ¿cómo determinas cuál es la última noticia para un administrador?... supongo que por el ID_NOTI (siempre y cuando este sea un número autoincremental)... ¿Tienes algún otro campo fecha o algo parecido para determinar cuál es la última noticia? Mucho ojo con estos detalles... es importante que no los olvides mencionar cuando hagas alguna pregunta. También es conveniente que nos pongas algunos datos de ejemplo, siempre será más fácil visualizar qué es lo que necesitas partiendo de esta información...

Tratando de jugar al adivino y a partir de la información que pones en tu consulta, creo que tienes algo como esto en tus tablas noticias y admin:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM noticias;
  2. +---------+--------+----------+
  3. | id_noti | noti   | id_admin |
  4. +---------+--------+----------+
  5. |       1 | noti 1 |        1 |
  6. |       2 | noti 2 |        2 |
  7. |       3 | noti 3 |        1 |
  8. |       4 | noti 4 |        2 |
  9. |       5 | noti 5 |        3 |
  10. |       6 | noti 6 |        3 |
  11. |       7 | noti 7 |        1 |
  12. |       8 | noti 8 |        2 |
  13. +---------+--------+----------+
  14. 8 rows in set (0.03 sec)
  15.  
  16. mysql> SELECT * FROM admin;
  17. +----------+------------+
  18. | id_admin | nombre     |
  19. +----------+------------+
  20. |        1 | admin uno  |
  21. |        2 | admin dos  |
  22. |        3 | admin tres |
  23. +----------+------------+
  24. 3 rows in set (0.00 sec)

Hay muchas formas de obtener el último registro para cada elemento agrupado, por lo general implica el uso de la función MAX... una forma para obtener lo que creo que necesitas sería así:

Código MySQL:
Ver original
  1. mysql> SELECT n.id_noti, n.noti, a.nombre
  2.     -> FROM noticias n
  3.     -> INNER JOIN admin a  ON n.id_admin = a.id_admin
  4.     -> INNER JOIN ( SELECT id_admin, MAX(id_noti) max_id_noti
  5.     ->              FROM noticias GROUP BY id_admin) n2
  6.     ->  ON n.id_admin = n2.id_admin AND n.id_noti = n2.max_id_noti
  7.     -> ORDER BY n.id_noti DESC;
  8. +---------+--------+------------+
  9. | id_noti | noti   | nombre     |
  10. +---------+--------+------------+
  11. |       8 | noti 8 | admin dos  |
  12. |       7 | noti 7 | admin uno  |
  13. |       6 | noti 6 | admin tres |
  14. +---------+--------+------------+
  15. 3 rows in set (0.00 sec)

No recomiendo hacer las uniones en el FROM-WHERE, como lo estás haciendo... sino que utilizo siempre JOIN's...

Observa la subconsulta marcada como n2 ahí empleo la función MAX para determinar la última noticia de cada administrador... esta información la utilizo para filtrar una consulta equivalente a la que tu estás haciendo.

Dale un vistazo para ver si es lo que necesitas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 01/11/2012, 12:54
 
Fecha de Ingreso: mayo-2007
Mensajes: 7
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: Ordenar consulta sql. Simple ?

Muchísismas gracias Leo por una respuesta tan rápida y completa.

ME FUNCIONO PERFECTO !!!

Sólo tengo una duda : xp es recomendable usar JOIN en vez de FORM o WHERE ?
es para un mejor velocidad y eficiencia ? o x algún otro motivo ?

GRACIAS DE NUEVO !!!
  #4 (permalink)  
Antiguo 01/11/2012, 13:16
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Ordenar consulta sql. Simple ?

Hola de nuevo manya:

La teoría te dice que unir las tablas con el FROM-WHERE o con el JOIN es lo mismo, pero en la realidad no es así... algunos motores de BD tienen rutinas de optimización para el JOIN, lo que hace que sean más rápidas. Con pocos registros igual y no se nota la diferencia, pero cuando involucras muchas tablas o millones de registros las diferencias son considerables.

Además, desde mi punto de vista al utilizar JOIN's, las consultas son más "limpias" o legibles, sobre todo por el hecho de separar las condiciones de igualdad con las condiciones de filtrado... Siempre me gusta utilizar este ejemplo, observa esta consulta

Código:
SELECT 
  T1.campo1, T1.campo2, 
  T2.campo1, T2.campo2, 
  T3.campo1, T3.campo2, 
  T4.campo1, T4.campo1
FROM Tabla1 T1
INNER JOIN Tabla2 T2 ON T1.campo1 = T2.campo1 AND T1.campo2 = T2.campo2
INNER JOIN Tabla3 T3 ON T1.campo1 = T3.campo1 AND T1.campo2 = T3.campo2
INNER JOIN Tabla4 T4 ON T1.campo1 = T4.campo1 AND T1.campo2 = T4.campo2
WHERE
T1.campo1 = 'algo' AND
(T1.campo2 = 'nada' OR 
T1.id IN (1, 2, 3, 4, 5)) AND
T2.fecha BETWEEN '2012-01-01' AND CURDATE() AND 
T2.descripcion LIKE '%lo que sea'; 
Observa que las condiciones de union y las de filtros QUEDAN SEPARADAS... por lo tanto resulta más sencillo observar si falta alguna condición...

Además, dependiendo del motor de BD es posible que no puedas implementar LEFT o RIGTH JOIN si utilizas FROM-WHERE

Saludos
Leo
  #5 (permalink)  
Antiguo 01/11/2012, 13:31
 
Fecha de Ingreso: mayo-2007
Mensajes: 7
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: Ordenar consulta sql. Simple ?

IMPECABLE LEO !
MUY BUENA EXPLICACION ... tienes razón, trataré de utilizarlas en las próx, a ver que tal me va.

GRACIAS DE NUEVO !
UN ABRAZO

Etiquetas: select, simple, sql
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 07:44.