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

Problema son SQL MIN() Obtener ID del registro

Estas en el tema de Problema son SQL MIN() Obtener ID del registro en el foro de Mysql en Foros del Web. Hola compañeros. Os sigo desde hace mucho tiempo, de aquí ha salido mucho de mi código. Hoy no he encontrado una consulta SQL que me ...
  #1 (permalink)  
Antiguo 05/03/2012, 14:05
 
Fecha de Ingreso: marzo-2012
Mensajes: 4
Antigüedad: 12 años, 8 meses
Puntos: 0
Problema son SQL MIN() Obtener ID del registro

Hola compañeros.

Os sigo desde hace mucho tiempo, de aquí ha salido mucho de mi código.

Hoy no he encontrado una consulta SQL que me hace falta y la verdad, seguro que está pero no la encuentro.

El caso es el siguiente.

Tengo una tabla, llamémosla PRECIO

Esta tabla tiene los siguientes campos (ID, PRECIO, VENDEDOR, ARTICULO, OFICINA)

Entre otros campos que no son útiles y no interfieren en la consulta.

Bien el caso es que deseo obtener el ID del registro que este agrupado por VENDEDOR y que cumpla:

Sea una OFICINA identificada.
Sea un ARTICULO identificado.
Tenga el menor precio.

O explicado de otro modo, quiero los ID de los registros que son de una OFICINA y ARTICULO en concreto y que tenga el menor precio.

Por otro lado, tengo otro problema el precio puede aparecer duplicado, en ese caso me gustaría obtener el ID de menor valor...

Muchas gracias a todos por vuestra ayuda y por este grandísimo foro.
  #2 (permalink)  
Antiguo 06/03/2012, 01:03
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 14 años, 2 meses
Puntos: 331
Respuesta: Problema son SQL MIN() Obtener ID del registro

SELECT MIN(P.precio) FROM PRECIO P WHERE P.oficina = '' AND P.articulo = '';
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 06/03/2012, 01:29
 
Fecha de Ingreso: marzo-2012
Mensajes: 4
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Problema son SQL MIN() Obtener ID del registro

Cita:
Iniciado por repara2 Ver Mensaje
SELECT MIN(P.precio) FROM PRECIO P WHERE P.oficina = '' AND P.articulo = '';
Gracias por la respuesta, pero no es lo que busco. No me he explicado bien.

Esa consulta me vale para saber el Precio MIN, pero busco el ID de ese precio min y ademas despues de agrupar por vendedor (busco ese precio MIN para cada vendedor).

Si pongo

SELECT ID, MIN(P.precio) FROM PRECIO P WHERE P.oficina = 'ofi' AND P.articulo = 'art' GROUP by VENDEDOR

me devuelve el primer ID que encuentra y yo quiero el del precio MIN.

muchas gracias.
  #4 (permalink)  
Antiguo 06/03/2012, 02:36
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 14 años, 2 meses
Puntos: 331
Respuesta: Problema son SQL MIN() Obtener ID del registro

Entonces así:

Código MySQL:
Ver original
  1. SELECT P.* FROM precio P WHERE P.precio IN(SELECT MIN(P.precio) FROM precio P GROUP BY vendedor);
__________________
Fere libenter homines, id quod volunt, credunt.
  #5 (permalink)  
Antiguo 06/03/2012, 11:20
 
Fecha de Ingreso: marzo-2012
Mensajes: 4
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Problema son SQL MIN() Obtener ID del registro

Cita:
Iniciado por repara2 Ver Mensaje
Entonces así:

Código MySQL:
Ver original
  1. SELECT P.* FROM precio P WHERE P.precio IN(SELECT MIN(P.precio) FROM precio P GROUP BY vendedor);
Gracias repara2.

Voy a probar, aunque no veo el filtro de oficina y articulo... pero ya tengo una base...

os comento.

gracias.
  #6 (permalink)  
Antiguo 06/03/2012, 13:33
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Problema son SQL MIN() Obtener ID del registro

Hola ebolavih:

La consulta de repara2 podría funcionar (agregando la parte de los filtros que comentas), sin embargo, en la medida de lo posible, hay que evitar el uso de restricciones IN al filtrar información, ya que estas son las peores en cuanto a rendimiento. En su defecto hay que utilizar EXISTS o como muestro a continuación hay una alternativa utilizando JOIN's que posiblemente te pueda ayudar:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+--------+------------+------------+-----------+
  3. | ID   | PRECIO | VENDEDOR   | ARTICULO   | OFICINA   |
  4. +------+--------+------------+------------+-----------+
  5. |    1 |     10 | vendedor 1 | articulo a | oficina a |
  6. |    2 |     12 | vendedor 1 | articulo a | oficina a |
  7. |    3 |     12 | vendedor 1 | articulo b | oficina b |
  8. |    4 |     13 | vendedor 1 | articulo b | oficina b |
  9. |    5 |     10 | vendedor 2 | articulo a | oficina a |
  10. |    6 |     11 | vendedor 2 | articulo a | oficina a |
  11. |    7 |     20 | vendedor 2 | articulo b | oficina b |
  12. |    8 |     10 | vendedor 2 | articulo b | oficina b |
  13. |    9 |     10 | vendedor 1 | articulo a | oficina a |
  14. +------+--------+------------+------------+-----------+
  15. 9 rows in set (0.00 sec)
  16.  
  17. mysql> SELECT T1.* FROM tabla T1 INNER JOIN
  18.     -> (SELECT vendedor, MIN(precio) min_precio FROM tabla
  19.     -> WHERE articulo = 'articulo a' AND oficina = 'oficina a'
  20.     -> GROUP BY vendedor) T2
  21.     -> ON T1.vendedor = T2.vendedor AND T1.precio = T2.min_precio
  22.     -> WHERE T1.articulo = 'articulo a' AND T1.oficina = 'oficina a';
  23. +------+--------+------------+------------+-----------+
  24. | ID   | PRECIO | VENDEDOR   | ARTICULO   | OFICINA   |
  25. +------+--------+------------+------------+-----------+
  26. |    1 |     10 | vendedor 1 | articulo a | oficina a |
  27. |    5 |     10 | vendedor 2 | articulo a | oficina a |
  28. |    9 |     10 | vendedor 1 | articulo a | oficina a |
  29. +------+--------+------------+------------+-----------+
  30. 3 rows in set (0.00 sec)

Observa que para el vendedor 1 hay dos registros (con id 1 y 9) ya que ambos tienen el min precio. Dale un vistazo para ver si esto es más o menos lo que necesitas. Sería un buen ejercicio que analices todas la alternativas que se te han dado para que nos digas cuál resulta más eficiente con tus datos.

Saludos
Leo.
  #7 (permalink)  
Antiguo 06/03/2012, 15:12
 
Fecha de Ingreso: junio-2011
Mensajes: 139
Antigüedad: 13 años, 5 meses
Puntos: 42
Respuesta: Problema son SQL MIN() Obtener ID del registro

Hola leonardo_josue,

Otra alternativa a la consulta: http://sqlfiddle.com/#!2/7f9b4/1
  #8 (permalink)  
Antiguo 06/03/2012, 16:02
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Problema son SQL MIN() Obtener ID del registro

Hola wchiquito:

En espera de lo que nos pueda confirmar el autor del post ebolavih, hay un pequeño detalle con la consulta que propone. La consulta obtiene el mínimo precio de todos los vendedores. Por lo que entendí lo que se pide es obtener el mínimo precio para cada vendedor... supongamos que se tienen los siguientes datos en lugar de los propuestos en mi primer post;

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+--------+------------+------------+-----------+
  3. | ID   | PRECIO | VENDEDOR   | ARTICULO   | OFICINA   |
  4. +------+--------+------------+------------+-----------+
  5. |    1 |     10 | vendedor 1 | articulo a | oficina a |
  6. |    2 |     12 | vendedor 1 | articulo a | oficina a |
  7. |    3 |     12 | vendedor 1 | articulo b | oficina b |
  8. |    4 |     13 | vendedor 1 | articulo b | oficina b |
  9. |    5 |      8 | vendedor 2 | articulo a | oficina a |
  10. |    6 |     11 | vendedor 2 | articulo a | oficina a |
  11. |    7 |     20 | vendedor 2 | articulo b | oficina b |
  12. |    8 |     10 | vendedor 2 | articulo b | oficina b |
  13. |    9 |     10 | vendedor 1 | articulo a | oficina a |
  14. +------+--------+------------+------------+-----------+
  15. 9 rows in set (0.02 sec)

Al realizar ambas consultas se obtienen estos resultados:



Código MySQL:
Ver original
  1. mysql> SELECT T1.* FROM tabla T1 INNER JOIN
  2.     -> (SELECT vendedor, MIN(precio) min_precio FROM tabla
  3.     -> WHERE articulo = 'articulo a' AND oficina = 'oficina a'
  4.     -> GROUP BY vendedor) T2
  5.     -> ON T1.vendedor = T2.vendedor AND T1.precio = T2.min_precio
  6.     -> WHERE T1.articulo = 'articulo a' AND T1.oficina = 'oficina a';
  7. +------+--------+------------+------------+-----------+
  8. | ID   | PRECIO | VENDEDOR   | ARTICULO   | OFICINA   |
  9. +------+--------+------------+------------+-----------+
  10. |    1 |     10 | vendedor 1 | articulo a | oficina a |
  11. |    5 |      8 | vendedor 2 | articulo a | oficina a |
  12. |    9 |     10 | vendedor 1 | articulo a | oficina a |
  13. +------+--------+------------+------------+-----------+
  14. 3 rows in set (0.00 sec)
  15.  
  16. mysql> SELECT
  17.     ->  t1.id,
  18.     ->  t1.precio,
  19.     ->  t1.vendedor,
  20.     ->  t1.articulo,
  21.     ->  t1.oficina
  22.     -> FROM
  23.     ->  tabla t1
  24.     -> WHERE
  25.     ->  t1.articulo = 'articulo a' AND
  26.     ->  t1.oficina = 'oficina a' AND
  27.     ->  t1.precio = (SELECT MIN(precio)
  28.     ->                  FROM
  29.     ->                          tabla
  30.     ->                  WHERE
  31.     ->                          articulo = t1.articulo AND
  32.     ->                          oficina = t1.oficina);
  33. +------+--------+------------+------------+-----------+
  34. | id   | precio | vendedor   | articulo   | oficina   |
  35. +------+--------+------------+------------+-----------+
  36. |    5 |      8 | vendedor 2 | articulo a | oficina a |
  37. +------+--------+------------+------------+-----------+
  38. 1 row in set (0.00 sec)

Sólo sería cuestión de considerar también al vendedor en la subconsulta interna:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->  t1.id,
  3.     ->  t1.precio,
  4.     ->  t1.vendedor,
  5.     ->  t1.articulo,
  6.     ->  t1.oficina
  7.     -> FROM
  8.     ->  tabla t1
  9.     -> WHERE
  10.     ->  t1.articulo = 'articulo a' AND
  11.     ->  t1.oficina = 'oficina a' AND
  12.     ->  t1.precio = (SELECT MIN(precio)
  13.     ->                  FROM
  14.     ->                          tabla
  15.     ->                  WHERE
  16.     ->                          articulo = t1.articulo AND
  17.     ->                          oficina = t1.oficina AND
  18.     ->                          vendedor = t1.vendedor);
  19. +------+--------+------------+------------+-----------+
  20. | id   | precio | vendedor   | articulo   | oficina   |
  21. +------+--------+------------+------------+-----------+
  22. |    1 |     10 | vendedor 1 | articulo a | oficina a |
  23. |    5 |      8 | vendedor 2 | articulo a | oficina a |
  24. |    9 |     10 | vendedor 1 | articulo a | oficina a |
  25. +------+--------+------------+------------+-----------+
  26. 3 rows in set (0.00 sec)

Y vuelvo a insistir, ahora que tiene varias opciones ebolavih debería probarlas todas y decirnos cuál de ellas representó la mejor alternativa, para poder considerarlo en un futuro.

Saludos
Leo.
  #9 (permalink)  
Antiguo 12/03/2012, 01:18
 
Fecha de Ingreso: marzo-2012
Mensajes: 4
Antigüedad: 12 años, 8 meses
Puntos: 0
De acuerdo Respuesta: Problema son SQL MIN() Obtener ID del registro

Aunque lo parezca no os tengo olvidados...

Yo pensaba que sabía de SQL pero lo cierto es que no tengo ni idea... que de posibilidades.

Cita:

Hola wchiquito:

En espera de lo que nos pueda confirmar el autor del post ebolavih, hay un pequeño detalle con la consulta que propone. La consulta obtiene el mínimo precio de todos los vendedores. Por lo que entendí lo que se pide es obtener el mínimo precio para cada vendedor... supongamos que se tienen los siguientes datos en lugar de los propuestos en mi primer post;
Pues leonardo_josue tiene más razón que un santo... :) y es que su función es la buena. El objetivo es una lista de vendedores en una Oficina y Con un articulo con su precio MIN para poder compararlos de un vistazo y ver desviaciones de manera sencilla (si un vendedor tiene un precio min por debajo de un valor dado se realiza otra consulta más detallada de ese vendedor y por supuesto más sencilla.)

Por otro lado la web que me proporciona wchiquito no la conocía, por lo que le doy las gracias, me va a ayudar muchísimo.

Veo que por aquí la usáis mucho.

Muchas gracias a ambos y a repara2 que empezó el debate.

La solución es correctísima por lo que doy el tema por cerrado.

Etiquetas: min, registro, registros, son, sql, tabla, campos
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 00:01.