Ver Mensaje Individual
  #2 (permalink)  
Antiguo 24/10/2015, 09:24
Avatar de mortiprogramador
mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 15 años, 2 meses
Puntos: 214
Respuesta: Agrupar resultados y ordenarlos

Saludo

Uhm, a ver.
Vamos a suponer que tengo estos datos.

Código HTML:
Ver original
  1. id id_t   nombre   precio
  2. 1     1     producto1     30
  3. 2     1     producto2     45
  4. 3     1     producto3     16
  5. 4     2     producto4     4
  6. 5     2     producto5     8
  7. 6     2     producto6     15
  8. 7     3     producto7     189
  9. 8     3     producto8     48
  10. 9     3     producto9     58

Uno tal vez esperaría que el resultado fuese

Código HTML:
Ver original
  1. id id_t nombre precio
  2. 4     2     producto4 4
  3. 3     1     producto3 16
  4. 8     3     producto8 48


Ahora, teniendo en cuenta el query propuesto:
Código SQL:
Ver original
  1. SELECT *
  2. FROM productos
  3. GROUP BY id_t
  4. ORDER BY precio ASC

A primera vista, uno diría, así es.
Sin embargo, sql tiene su forma de hacer las cosas
no tan explicitamente como nosotros quisieramos.

A detallar.
Primero hace el group by, obteniendo

Código HTML:
Ver original
  1. id id_t nombre precio
  2. 1     1     producto1     30
  3. 4     2     producto4     4
  4. 7     3     producto7     189


Y luego sí aplica el order

Código HTML:
Ver original
  1. id id_t   nombre   precio
  2. 4     2     producto4     4
  3. 1     1     producto1     30
  4. 7     3     producto7     189


Esto quiere decir que primero agrupo,
y luego a este grupo de datos le aplicó el order.


Para solventar esto, yo propongo traer el precio mínimo de un producto
de cada grupo obtenido, y ordenar por ese campo.

Código SQL:
Ver original
  1. SELECT *, MIN(precio) minimo
  2. FROM productos
  3. GROUP BY id_t
  4. ORDER BY minimo

Obteniendo esto

Código HTML:
Ver original
  1. id id_t nombre precio minimo
  2. 4     2     producto4 4         4
  3. 1     1     producto1 30       16
  4. 7     3     producto7 189     48


Aquí ya nos trajo bien los precios mínimos,
pero la información de los productos es el resultado del group by,
no la esperada.

Así el asunto, propongo este query:
Código SQL:
Ver original
  1. SELECT * FROM productos
  2. WHERE precio IN
  3. (
  4. SELECT MIN(precio) minimo
  5. FROM productos
  6. GROUP BY id_t
  7. ORDER BY minimo ASC
  8. )
  9. ORDER BY precio ASC

Obteniendo

Código HTML:
Ver original
  1. id id_t nombre precio
  2. 4     2     producto4 4
  3. 3     1     producto3 16
  4. 8     3     producto8 48


Sin embargo, quise hacer el mismo query por EXISTS y no obtengo
el mismo resultado, pero ya es más por cosa mía. Con el IN te basta a tí.

Finalmente, tal vez invocando a
gnzsoloyo ,
a él sí se le haga claro el camino para hacerlo por EXISTS.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com