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

[SOLUCIONADO] Consulta compleja?

Estas en el tema de Consulta compleja? en el foro de Mysql en Foros del Web. Hola y por favor necesito ayuda para realizar una consulta así: tabla factura: id_factura tabla compra: id_compra, id_articulo, id_factura, estado dos tablas: factura y compra, ...
  #1 (permalink)  
Antiguo 19/08/2013, 13:26
Avatar de luisebaq  
Fecha de Ingreso: septiembre-2011
Ubicación: Colombia
Mensajes: 45
Antigüedad: 12 años, 7 meses
Puntos: 1
Consulta compleja?

Hola y por favor necesito ayuda para realizar una consulta así:

tabla factura: id_factura
tabla compra: id_compra, id_articulo, id_factura, estado

dos tablas: factura y compra, en la tabla compra cada compra tiene un estado:

1 fuera de la bolsa, 2 en la bolsa

Nota: la compra se genera cuando se toma un articulo (cuya tabla no aparece por que no interesa) y meterlo en la factura, así cada factura podría tener los artículos que sea.


Quiero seleccionar todos los id_facturas cuyas compras estén todas en la bolsa(2), dicho de otra forma: si hubiera una compra de esa factura fuera de la bolsa no se selecciona ese id_compra

como lo hago, esta es posiblemente la consulta mas dificil del proyecto y no me ha salido hace dias.

gracias.
  #2 (permalink)  
Antiguo 19/08/2013, 13:59
 
Fecha de Ingreso: febrero-2013
Ubicación: Lima
Mensajes: 301
Antigüedad: 11 años, 2 meses
Puntos: 5
Respuesta: Consulta compleja?

por lo que entiendo, la consulta seria algo como esto:
Código MySQL:
Ver original
  1. create table factura(
  2. id_factura varchar(5)
  3. );
  4.  
  5. create table compra(
  6. id_compra varchar(5),
  7. id_articulo varchar(5),
  8. id_factura varchar(5),
  9. estado varchar(2)
  10. );
  11.  
  12. insert into factura values('FCT01');
  13. insert into factura values('FCT02');
  14. insert into factura values('FCT03');
  15. insert into compra values ('CMP01','ART01','FCT01','2');
  16. insert into compra values ('CMP02','ART02','FCT02','1');
  17. insert into compra values ('CMP03','ART03','FCT03','1');
  18. insert into compra values ('CMP04','ART04','FCT03','2');
  19. insert into compra values ('CMP05','ART05','FCT01','2');
  20.  
  21. select a.*
  22. from factura a inner join compra b
  23. on a.id_factura = b.id_factura
  24. and b.estado ='2';

espero te sirva.....
__________________
Lo que no se....tampoco creo saberlo....

Última edición por gnzsoloyo; 19/08/2013 a las 14:09 Razón: Errores de sintaxis para MySQL.
  #3 (permalink)  
Antiguo 19/08/2013, 14:05
 
Fecha de Ingreso: agosto-2013
Ubicación: Galicia
Mensajes: 8
Antigüedad: 10 años, 8 meses
Puntos: 1
Respuesta: Consulta compleja?

Deberías usar una subquery o un join
Busca ejemplos en google, que hay mil
  #4 (permalink)  
Antiguo 19/08/2013, 14:08
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: Consulta compleja?

@ambichol: Ten cuidado con las sintaxis de diferentes DBMS, al crear los ejemplos.
En MySQL el "#" se usa para comentarios de línea, por lo que tu script no se puede ejecutar. Además, toda sentencia debe terminar forzosamente en un ";", de lo contrario genera un error de sintaxis.
Es decir, esto:
Código MySQL:
Ver original
  1. CREATE TABLE #factura(
  2. id_factura varchar(5)
  3. )

Se debe escribir:
Código MySQL:
Ver original
  1. CREATE TABLE factura(
  2. id_factura varchar(5)
  3. );

¿Se ve la diferencia visual del código?
__________________
¿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 19/08/2013, 14:47
 
Fecha de Ingreso: febrero-2013
Ubicación: Lima
Mensajes: 301
Antigüedad: 11 años, 2 meses
Puntos: 5
Respuesta: Consulta compleja?

@gnzsoloyo, gracias por la aclaracion, creo me salte ese paso....jejejeje
__________________
Lo que no se....tampoco creo saberlo....
  #6 (permalink)  
Antiguo 19/08/2013, 14:56
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: Consulta compleja?

No problem.
Es un problema muy común cuando andamos saltando de DBMS en DBMS...
Yo suelo escribir SP en tres diferentes, y a veces meto la pata en alguno...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 20/08/2013, 10:15
Avatar de luisebaq  
Fecha de Ingreso: septiembre-2011
Ubicación: Colombia
Mensajes: 45
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Consulta compleja?

Gracias por sus respuestas,

ambichol el resultado del query no es el esperado,

ese query esta mostrándome facturas que tiene compras en estado 2 pero que también tienen compras en estado 1, la idea es que el query retorne los id_facturas de aquellas facturas cuyas compras todas están en estado 2!

debe ser algo asi como contar y luego hacer la comparación en la misma consulta o con un sub query, pero no tengo claro como crear subquerys lo máximo que sé es hacer inner jois y leftjoins y no creo que con eso sea suficiente.

gracias.


Alguna idea?
  #8 (permalink)  
Antiguo 20/08/2013, 11:01
 
Fecha de Ingreso: febrero-2013
Ubicación: Lima
Mensajes: 301
Antigüedad: 11 años, 2 meses
Puntos: 5
Respuesta: Consulta compleja?

mmm.....podrias mostrar el nombre de los campos de las tablas y algunos datos...??? ya que el ejemplo solo es de muestra, la idea era que te sirva como base para que puedas desarrollar tu query......u.u
__________________
Lo que no se....tampoco creo saberlo....
  #9 (permalink)  
Antiguo 20/08/2013, 23:08
Avatar de luisebaq  
Fecha de Ingreso: septiembre-2011
Ubicación: Colombia
Mensajes: 45
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Consulta compleja?

ambichol


los datos que tu escribiste arriba están perfectos, esa es la idea, solo imagínate que la tabla factura solo hay una factura
y en la tabla compras hay dos registros que pertenecen a la unica factura existente, pero de esos dos registros uno tiene el campo estado en 1 y el otro en 2, entonces, como hacer un query que retorne el id_factura cuando el campo "estado" de la tabla "compras" para una misma factura se encuentran todos en "2"

osea que se podría hacer el query sin meterse con la tabla "facturas", solo con "compras" ya que ahí esta el id_factura


y debería funcionar para tantas facturas como hayan. :S

sera que se puede hacer en una sola consulta¿
  #10 (permalink)  
Antiguo 22/08/2013, 17:50
Avatar de luisebaq  
Fecha de Ingreso: septiembre-2011
Ubicación: Colombia
Mensajes: 45
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Consulta compleja?

Lo que yo digo es algo así, pero no me sale:

select id_factura, count(*) as cantidad
from compras
where cantidad=(select id_factura, count(*) from compras where estado=2 group by id_factura)
group by id_factura


notese como intento comparar cantidad con una subconsulta.
me sale un error: Error Code : 1241
Operand should contain 1 column(s)
en ese error si incluyo un campo mas de la tabla en el where igual sigue saliendo

asi que mas o menos es así, alguna opinión?
  #11 (permalink)  
Antiguo 22/08/2013, 18:10
Avatar de luisebaq  
Fecha de Ingreso: septiembre-2011
Ubicación: Colombia
Mensajes: 45
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Consulta compleja?

Tal parece que lo solucione de esta forma atando cabos:

Código MySQL:
Ver original
  1. select id_factura, count(*) as cantidad
  2. from compras
  3. group by id_factura
  4. having cantidad=(select count(*) as cantidad from compras where estado=2 group by id_factura)

gracias por sus colaboraciones :)

Última edición por gnzsoloyo; 22/08/2013 a las 19:36

Etiquetas: grande, 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 16:03.