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

como se hacen estas consultas sql

Estas en el tema de como se hacen estas consultas sql en el foro de Mysql en Foros del Web. estas consultas. No quiero q me hagan el codigo. Sino la logica q se usa.... Me confunde cuando hay "todos" o "ninguno" ... No se ...
  #1 (permalink)  
Antiguo 13/07/2012, 09:34
 
Fecha de Ingreso: junio-2010
Mensajes: 752
Antigüedad: 13 años, 10 meses
Puntos: 5
como se hacen estas consultas sql

estas consultas. No quiero q me hagan el codigo. Sino la logica q se usa.... Me confunde cuando hay "todos" o "ninguno" ... No se si usa is null. Left join... Exist...bueno gracias....

HERRAMIENTA (ID , NOMBRE, COLOR, PRECIO) ID->PK

PROVEEDOR (NRO, RAZON_SOCIAL, TELEFONO, DIRECCION) NRO->PK

MATERIAL (COD, NOMBRE ) COD -> PK

COMPUESTO_POR (HERRAMIENTA_ID , MATERIAL_COD) AMBOS -> PK Y FK

PROVEE (MATERIAL_COD , PROVEEDOR_NRO ) AMBOS -> PK Y FK

-------------------------------------


a- lISTE ID Y NOMBRE DE LOS MATERIALES QUE SON PROVISTAS POR TODOS LOS PROVEEDORES


B- MUESTRE EL NOMBRE DE LOS MATERIALES QUE NO SON USADOS EN NINGUNA HERRAMIENTA

Última edición por vani18; 13/07/2012 a las 10:13
  #2 (permalink)  
Antiguo 13/07/2012, 10:30
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: como se hacen estas consultas sql

Hola vani18:

Para el primer ejercicio:

Cita:
a- lISTE ID Y NOMBRE DE LOS MATERIALES QUE SON PROVISTAS POR TODOS LOS PROVEEDORES
Tienes que tener en cuenta dos cosas, en primer lugar la tabla PROVEE (para saber qué material es proveído por qué proveedor) y la tabla PROVEEDOR, ya que debes determinar cuál es el número de proveedores existentes. Hay varias formas de resolver esta consulta, pero la idea sería básicamente contar cuantos proveedores tienen cada material y asegurarte que ese número sea igual al total de proveedores (utilizando HAVING), en otras palabras, sería más o menos así:


Código MySQL:
Ver original
  1. mysql> SELECT * FROM provee;
  2. +------------+--------+
  3. | idMaterial | idProv |
  4. +------------+--------+
  5. |          1 |      1 |
  6. |          1 |      2 |
  7. |          2 |      1 |
  8. |          3 |      2 |
  9. +------------+--------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM proveedores;
  13. +--------+--------+
  14. | idProv | nombre |
  15. +--------+--------+
  16. |      1 | uno    |
  17. |      2 | dos    |
  18. +--------+--------+
  19. 2 rows in set (0.07 sec)
  20.  
  21. mysql> SELECT idMaterial, COUNT(*) FROM provee GROUP BY idMaterial;
  22. +------------+----------+
  23. | idMaterial | COUNT(*) |
  24. +------------+----------+
  25. |          1 |        2 |
  26. |          2 |        1 |
  27. |          3 |        1 |
  28. +------------+----------+
  29. 3 rows in set (0.33 sec)

Aquí resulta obvió que ni el material 2 ni el material 3 son provistos por todos los proveedores existentes...

Para la segunda consulta:

Cita:
B- MUESTRE EL NOMBRE DE LOS MATERIALES QUE NO SON USADOS EN NINGUNA HERRAMIENTA
En esta también puedes hacerla de muchas maneras, podrías utilizar una sentencia NOT IN, NOT EXISTS o hacer un LEFT JOIN y preguntar por los registros Nulos...

SELECCIONAR de la lista de MATERIALES todos los id DONDE el id
NO SE ENCUENTRE (SELECCIONAR todos los materiales que se utilizan en COMPUESTO_POR)

Intenta resolverlas y si continuas con dudas nos comentas y lo revisamos.

Saludos
Leo.
  #3 (permalink)  
Antiguo 14/07/2012, 01:56
 
Fecha de Ingreso: junio-2010
Mensajes: 752
Antigüedad: 13 años, 10 meses
Puntos: 5
Hola a ver trate de hacer la 1 y salio esto...


Select cod,nombre
From material
Where cod= (select material_cod,count(proveedor_nro)
from provee
Group by (material_cod)
HAVING (count(proveedor_nro))=

(select count (nro)
From proveedor)
)


Y la consulta 2 que dice sobre los inmuebles que no fueron alquilados hice esto


Select nombre
From materiales
Where cod not in (

Select material_cod
From compuesto_por
)



Estan bien como resolvi...o hay q corregir algo?
  #4 (permalink)  
Antiguo 14/07/2012, 07:49
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: como se hacen estas consultas sql

Cita:
Y la consulta 2 que dice sobre los inmuebles que no fueron alquilados
Eso lo preguntaste en otro post, el cual aún parece que no has leído...

http://www.forosdelweb.com/f86/como-...3/#post4231663
__________________
¿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 14/07/2012, 08:18
 
Fecha de Ingreso: junio-2010
Mensajes: 752
Antigüedad: 13 años, 10 meses
Puntos: 5
Respuesta: como se hacen estas consultas sql

ah si disculpa. me ocupe primero de resolver estos ejercicios...


el que dice 2...seria esto

"MUESTRE EL NOMBRE DE LOS MATERIALES QUE NO SON USADOS EN NINGUNA HERRAMIENTA"
  #6 (permalink)  
Antiguo 14/07/2012, 09:13
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: como se hacen estas consultas sql

Mira el ejemplo del otro post y usa LEFT JOIN del mismo modo. Lo unico que cambia son las tablas, pero la logica es la misma. Usar subconsultas en el WHERE es ineficiente si esa subconsulta duelve muchos registros, como te pasaría en tu caso.
En esencial, lo que debes hacer es un LEFT JOIN entre la tabla de Materiales y la de Compuesto_Por, tal que lo devuelto en la segunda tabla sea NULL.

Código MySQL:
Ver original
  1.     M.*
  2.     Material M
  3.     LEFT JOIN Compuesto_Por C ON M.COD = C.material_cod
  4.     C.material_cod IS NULL;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 14/07/2012 a las 09:40
  #7 (permalink)  
Antiguo 14/07/2012, 10:09
 
Fecha de Ingreso: junio-2010
Mensajes: 752
Antigüedad: 13 años, 10 meses
Puntos: 5
Hola bueno ahora me fijo ese. Hice otro aparte.. donde la consulta a realizar dice....

"indique el nombre de proveedor y cantidad de materiales que provee, solamente para aquellos que provean mas de 5 materiales"

Lo que hice..es esto....

Select razon_social ,count (*)
From proveedor
Where nro=(select id
From provee
Group by (proveedor_nro)
count (material_cod)
having (count(material_cod)) > 5
)
  #8 (permalink)  
Antiguo 18/07/2012, 01:04
 
Fecha de Ingreso: junio-2010
Mensajes: 752
Antigüedad: 13 años, 10 meses
Puntos: 5
otro duda. de una consulta. ..

Bueno siguiendo. Con las tablas q coloque al principio del post.....


Tengo una consulta sql y como la hice... Me dicen si hay un error... Creo q aveces ,me equivoco cuando una subconsulta devuelve un solo valor o varios . En todo caso solo es el igual por el IN

Bueno la consulta dice

Elimine los materiales que componen la herramienta del codigo 343 ....


Esto hice...

Delete *
From material
Where cod =(select material_cod
From compuesto_por
Where herramienta_id=343)


Esta bien ?? La sintaxis... etc..
  #9 (permalink)  
Antiguo 18/07/2012, 08:08
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: como se hacen estas consultas sql

Hola vani18:

La sintaxis de la consulta, es correcta, sin embargo, pudieras tener un error de ejecución si (como lo deduces muy bien) la subconsulta regresa más de un valor. en este caso debes utilizar IN, de esta manera, no importa si la subconsulta te regresa NULL, 1 registro o N registros, la sentencia IN soporta todos los casos.

También podrías utilizar una JOIN para eliminar los registros, la sentencia sería más o menos así:

Código MySQL:
Ver original
  1. DELETE material.*
  2. FROM material
  3. INNER JOIN compuesto_por ON material.cod = compuesto_por.material_cod
  4. WHERE compuesto_por.herramienta_id=343

Al poner material.* estás especificando que sólo se eliminarán los elementos de la tabla material que cumplan con la condición de igualdad... el resultado debería ser el mismo. Haz la prueba y nos comentas.

Saludos
Leo.

Etiquetas: join, 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 02:38.