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

me repite los registros

Estas en el tema de me repite los registros en el foro de Mysql en Foros del Web. buenas. amigos. del foro. soy nuevo y necesito una manita. tengo una tabla: ofertas con los campos algunos para no marear. ---------------- tabla:oferta idproducto proveedor ...
  #1 (permalink)  
Antiguo 12/11/2012, 07:11
 
Fecha de Ingreso: noviembre-2012
Mensajes: 3
Antigüedad: 11 años, 5 meses
Puntos: 0
me repite los registros

buenas. amigos. del foro. soy nuevo y necesito una manita. tengo una tabla:
ofertas con los campos algunos para no marear.
----------------
tabla:oferta
idproducto
proveedor
precio
cantidad
posicion
selecmanual
-----------------
donde sobre un mismo IDPRODUCTO existen varios PROVEEDOR pero con diferentes precios, hasta aqui vamos bien. el problema surge cuando necesito extraer solo los productos con la posicion en 1, donde yo aplico la siguiente consulta
---------------------------------------
select * from oferta order by idproducto,posicion
---------------------------------------
donde devuelve lo siguiente
idproducto proveedor precio cantidad posicion selecmanual
1000 prove1 0.50 12 1 .f.
1000 prove2 0.53 12 2 .f.
1000 prove3 1.00 12 3 .f.
1001 prove1 1.20 11 1 .f.
1001 prove2 1.50 11 2 .t.
-**********************************
pero yo necesito aplicar la siguiente consulta
ES DECIR LOS PRODUCTOS QUE TIENEN POSICION 1 Y LOS QUE ESTAN SELECCIONADOS MANUALMENTE CON .T. PERO NO AMBOS
--------------------------------------------------------------------------
SELECT * FROM oferta WHERE posicion = 1 or (posicion > 1 AND manual = .t.) AND precio > 0 order by idproducto
--------------------------------------------------------------------------
PERO me devuelve el siguiente resultado
*********************
idproducto proveedor precio cantidad posicion selecmanual
1000 prove1 0.50 12 1 .f.
1001 prove1 1.20 11 1 .f.
1001 prove2 1.50 11 2 .t.
*********************
y no me sirve ya k nose komo obtener este resultado
*********************
idproducto proveedor precio cantidad posicion selecmanual
1000 prove1 0.50 12 1 .f.
[1001 prove2 1.50 11 2 .t.
*********************
DESDE YA MUY AGRADECIDO POR SU COLABORACION
SALUDOS.
  #2 (permalink)  
Antiguo 12/11/2012, 08:44
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: me repite los registros

Hola sosajuancarlosh:

Veo que este es tu primer mensaje, así es que antes que nada, bienvenido al foro, espero que sigas participando activamente en el foro, y si puedes hacer alguna contribución, pues adelante!.

ahora si, pasemos a tu problema... por lo que pude observar casi lograbas la consulta, creo que era solo cuestión de que continuaras investigando un poco... Las condiciones de filtrado pueden ser tan sencillas o tan complejas como necesites, para lo que tú quieres hacer de hecho hay muchas formas en que puedas conseguirla (con NOT IN, NOT EXISTS, o LEFT JOIN)... para el ejemplo voy a utilizar NOT EXISTS.

En la consulta que pones en tu post utilizas de manera correcta el operador OR, ya que en realidad son dos condiciones las que te interesan:

Código:
posicion = 1 or (posicion > 1 AND manual = .t.)  
Sin embargo, la primer parte de la condición, marcada con azul está incompleta, dado que debes excluir aquellos registros que cumplen con la segunda condición. Como te dije, hay varias formas de hacer esto, una sería así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM oferta;
  2. +------------+-----------+--------+----------+----------+-------------+
  3. | idproducto | proveedor | precio | cantidad | posicion | selecmanual |
  4. +------------+-----------+--------+----------+----------+-------------+
  5. |       1000 | prove1    |    0.5 |       12 |        1 | .f.         |
  6. |       1000 | prove2    |   0.53 |       12 |        2 | .f.         |
  7. |       1000 | prove3    |      1 |       12 |        3 | .f.         |
  8. |       1001 | prove1    |    1.2 |       11 |        1 | .f.         |
  9. |       1001 | prove2    |    1.5 |       11 |        2 | .t.         |
  10. +------------+-----------+--------+----------+----------+-------------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. mysql> SELECT * FROM oferta o1
  14.     -> WHERE
  15.     -> (o1.posicion = 1 AND NOT EXISTS ( SELECT o2.idproducto
  16.     ->                                   FROM oferta o2
  17.     ->                                   WHERE o2.idproducto = o1.idproducto
  18.     ->                                   AND o2.selecmanual = '.t.')
  19.     -> ) OR
  20.     -> (o1.posicion > 1 AND o1.selecmanual = '.t.');
  21. +------------+-----------+--------+----------+----------+-------------+
  22. | idproducto | proveedor | precio | cantidad | posicion | selecmanual |
  23. +------------+-----------+--------+----------+----------+-------------+
  24. |       1000 | prove1    |    0.5 |       12 |        1 | .f.         |
  25. |       1001 | prove2    |    1.5 |       11 |        2 | .t.         |
  26. +------------+-----------+--------+----------+----------+-------------+
  27. 2 rows in set (0.00 sec)

Observa que lo único que estoy haciendo es agregar una condición con NOT EXISTS para excluir los registros duplicados.

Código:
SELECT * FROM oferta o1 
WHERE 
(o1.posicion = 1 AND NOT EXISTS ( SELECT o2.idproducto 
                                  FROM oferta o2 
                                  WHERE o2.idproducto = o1.idproducto 
                                  AND o2.selecmanual = '.t.')
) OR 
(o1.posicion > 1 AND o1.selecmanual = '.t.');
Trata de analizar la consulta, y si tienes algún problema para entenderla, coméntalo en el foro. Y finalmente, como recomendación PRACTICA, PRACTICA Y PRACTICA... es la mejor manera para adquirir conocimientos en SQL.

Saludos
Leo.
  #3 (permalink)  
Antiguo 13/11/2012, 05:23
 
Fecha de Ingreso: noviembre-2012
Mensajes: 3
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: me repite los registros

leo. muchas gracias por tu rapida respuestas. espectacular. es lo que necesitaba. con esto solucione totalmente mi problema.
bien ahora surge otro pequeño inconveniente ya que la complique un poko mas a la consulta. Detallo el tema
NUEVA CONSULTA
************************************************** *****************
select tablabase10.cantidad, tablabase10.idnodo, l1.idproducto, l1.precio, l1.posicion, l1.manual, l1.idpliego from licita l1 INNER JOIN tablabase10 ON l1.idproducto = tablabase10.idproducto where l1.idpliego = 94 and (tablabase10.idpliego = 94 and tablabase10.idnodo = 61) AND l1.posicion = 1 AND NOT exists (select l2.idproducto from licita l2 where l2.idproducto = l1.idproducto and l2.manual = 1 and l2.idpliego = l1.idpliego ) OR l1.posicion > 1 AND l1.manual = 1 ORDER BY l1.idproducto, l1.posicion
************************************************** ***************
Y ME DA COMO RESULTADO
PRODUCTO CANTIDAD PRECIO IDPLIEGO IDNODO
1002 2000 0.1150 94 28
1002 200 0.1150 94 29
1002 6000 0.1150 94 30

1002 200 0.1150 94 61
1002 2000 0.1240 1 28
1002 200 0.1240 1 29
1002 6000 0.1240 1 30

1002 200 0.1240 1 61
1010 30 33.0000 94 61
1018 600 0.2090 94 61
1023 10 11.9900 94 61
1025 600 1.2000 94 61
..... sigue devolviendo la totalidad de los registro que cumplen con ser 94 y61

************************************************** ***************
y la consulta devuelve los resultados esperados y mas :), bien. el tema es que si yo cambio tablabase10.idpliego = 94 por solo 4 la consulta vuelve solo estos registros que serian los registros que estan incluidos dentro de la consulta de not exists que tu me enseñanste.
*****************************
1002 2000 0.1150 94 28
1002 200 0.1150 94 29
1002 6000 0.1150 94 30
1002 200 0.1150 94 61
1002 2000 0.1240 1 28
1002 200 0.1240 1 29
1002 6000 0.1240 1 30
1002 200 0.1240 1 61
*********************************
a ver pasando el limpio. lo que yo necesito es que efectivamente se cumple el filtro y que me devuelva solamente los registros para idpliego = 94 e idnodo = 61
***********************************
bueno amigos. muy agradecido por su colaboracion.
  #4 (permalink)  
Antiguo 13/11/2012, 06:31
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: me repite los registros

Por lo pronto, el OR que pusiste opera como una disyunción y hace que con sólo que sea TRUE esa condición y la siguiente, devuelva un resultado inesperado.
Tomate el trabajo de escribir estructuradamente la consulta para que puedas ver correctamente los bloques que se aevalúan. Cuando la pones de corrido es muy fácil meter la pata y no ver los errores de lógica.
También repasa algo de lógica proposicional y los operadores lógicos AND y OR para tener claro cómo se evalúan y construyen.

Pruebalo así (mira cómo la escribí para que trates de hacer algo como eso, te ayudará):
Código MySQL:
Ver original
  1.     T10.cantidad,
  2.     T10.idnodo,
  3.     l1.idproducto,
  4.     l1.precio,
  5.     l1.posicion,
  6.     l1.manual,
  7.     l1.idpliego
  8. from licita l1
  9.     INNER JOIN tablabase10 t10 ON l1.idproducto = T10.idproducto
  10.     l1.idpliego = 94
  11.     and (T10.idpliego = 94 and T10.idnodo = 61)
  12.     AND l1.posicion = 1
  13.     AND
  14.         (NOT exists
  15.             (select l2.idproducto
  16.             from licita l2
  17.             where
  18.                 l2.idproducto = l1.idproducto
  19.                 and l2.manual = 1
  20.                 and l2.idpliego = l1.idpliego )
  21.         OR l1.posicion > 1)
  22.         AND l1.manual = 1
  23. ORDER BY l1.idproducto, l1.posicion
__________________
¿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 13/11/2012, 07:11
 
Fecha de Ingreso: noviembre-2012
Mensajes: 3
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: me repite los registros

MUCHAS GRACIAS gnzsoloyo. por tu consejo. lo he llevado a la practica y la verdad que me ha aclarado mucho la vista en funcion de las conexiones para las tablas. y si pude resolver el problema solo tuve que añadir o reafirmar los filtros que estan al ultimo y asi funciona.
otra vez muchas gracias. por la ayuda.


esta si funciona biennnn
Código MySQL:
Ver original
  1.     t10.cantidad,
  2.     t10.idnodo,
  3.     l1.idproducto,
  4.     l1.precio,
  5.     l1.posicion,
  6.     l1.manual,
  7.     l1.idpliego
  8. from licita l1
  9.     INNER JOIN tablabase10 t10 ON l1.idproducto = t10.idproducto
  10. where   l1.idpliego = 94
  11.     and (t10.idpliego = 94 and t10.idnodo  = 61)
  12.     AND l1.posicion = 1
  13.     AND
  14.         NOT exists
  15.             (select l2.idproducto
  16.                 from licita l2
  17.                 where l2.idproducto = l1.idproducto
  18.                     and l2.manual = 1
  19.                     and l2.idpliego = l1.idpliego )
  20. OR l1.posicion > 1 AND l1.manual = 1
  21. and t10.idnodo = 61
  22. and l1.idpliego = 94
  23. ORDER BY l1.idproducto, l1.posicion

Última edición por sosajuancarlosh; 13/11/2012 a las 07:21

Etiquetas: registros, repite, select, 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 17:07.