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

Consultas MySQL

Estas en el tema de Consultas MySQL en el foro de Mysql en Foros del Web. Bueno tardes, necesito un poco de ayuda... Les cuento qe tengo qe hacer unas consultas, en base a la siguiente base de datos. Clientes: cve_clientes ...
  #1 (permalink)  
Antiguo 11/06/2009, 17:41
 
Fecha de Ingreso: mayo-2009
Mensajes: 12
Antigüedad: 14 años, 11 meses
Puntos: 0
Consultas MySQL

Bueno tardes, necesito un poco de ayuda...

Les cuento qe tengo qe hacer unas consultas, en base a la siguiente base de datos.

Clientes:
cve_clientes
nombre
edad
localidad
fecha_registro

Productos:
cve_producto
nombre
precio
cantidad
fecha_caducidad

Ventas:
cve_producto (Relacion con tabla Productos)
cve_clientes (Relacion con tabla Clientes)
cantidad
fecha
total


Bueno mis consultas son las siguientes:


1. Seleccionar el nombre de los clientes que compraron un producto por nombre "sabritas" durante el mes de julio
2. selecionar el nombre del ccliente y la cantidad de veces que este ha realizado una venta.


La mayoria de estas necesita una subconsulta, y todavia no logro enteder esa parte!

Mucchas gracias.

Última edición por CarloosN; 12/06/2009 a las 17:12
  #2 (permalink)  
Antiguo 11/06/2009, 22:58
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Consultas MySQL

Cita:
Seleccionar el nombre del cliente que mas ventas a realizado desde el inicio del sistema hasta la fecha
Trata de hacerla... si no funciona, pregunta que puede estar pasando. La fecha actual del sistema se hace con now() o curdate().
Cita:
Seleccionar el nombre de los clientes que compraron un producto por nombre "sabritas" durante el mes de julio
Debes relacionar las tablas con inner join.

Un saludo
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 11/06/2009, 23:29
 
Fecha de Ingreso: mayo-2009
Mensajes: 12
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: Consultas MySQL

Para la pregunta 4:


Cita:
Seleccionar el nombre de los clientes que compraron un producto por nombre "sabritas" durante el mes de julio
Lo eh intentado con este codigo

select nombre from clientes where cve_cliente=(select cve_cliente from ventas where cve_producto=(select cve_producto from productos where nombre like "%sabritas%"));

Pero me marca el siguiente error.

Subquery returns more than 1 row

No se qe pueda hacer
  #4 (permalink)  
Antiguo 12/06/2009, 05:04
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: Consultas MySQL

Es que el operador "=", en ese contexto y para ese objetivo no sirve (mas allá de que estás haciendo una consulta inútilmente compleja). Lo que corresponde es IN()
Ahora bien, esta consulta requiere solamente usar INNER JOIN:
Código sql:
Ver original
  1. SELECT nombre
  2. FROM clientes
  3.     INNER JOIN  ventas USING(cve_cliente)
  4.     INNER JOIN productos  USING(cve_producto)
  5. WHERE nombre LIKE '%sabritas%';
__________________
¿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 12/06/2009, 17:18
 
Fecha de Ingreso: mayo-2009
Mensajes: 12
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: Consultas MySQL

Bueno les comento qe eh podido realizar todas mis consultas a excepción de 2:

Cita:
1. Seleccionar el nombre de los clientes que compraron un producto por nombre "sabritas" durante el mes de julio
2. seleccionar el nombre del cliente y la cantidad de veces que este ha realizado una venta.
Para ambas necesito hacer un subconsulta, pero no puedo usar el Inner Join, ya qe lo tengo prohibido, si alguien me puede ayudar de otra manera, seria genial

Gracias.
  #6 (permalink)  
Antiguo 13/06/2009, 00:30
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consultas MySQL

Imagino que son ejercicios en los que busca que practiquéis subconsultas, porque si no no se entendería bien la prohibición de usar inner join.
Código sql:
Ver original
  1. SELECT nombre
  2. FROM clientes
  3. WHERE cve_clientes
  4. IN (
  5. SELECT cve_clientes
  6. FROM `ventas`
  7. WHERE MONTH( fecha ) =7
  8. AND cve_producto = (
  9. SELECT cve_producto
  10. FROM productos
  11. WHERE nombre = 'sabritas' )
Esto requiere dos subconsultas para hacer lo mismo que se haría con dos INNER JOIN fácilmente.
No sé si será algo así. Dinos si es esto lo que quieres, antes de seguir con la otra.

De todas formas dinos todas las condiciones que te han puesto, tal y como te las han puesto.

Última edición por jurena; 13/06/2009 a las 00:38
  #7 (permalink)  
Antiguo 13/06/2009, 12:17
 
Fecha de Ingreso: mayo-2009
Mensajes: 12
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: Consultas MySQL

Bueno al momento de agregar esto:

Código sql:
Ver original
  1. SELECT nombre
  2. FROM clientes
  3. WHERE cve_clientes
  4. IN (
  5. SELECT cve_clientes
  6. FROM `ventas`
  7. WHERE MONTH( fecha ) =7;

me aparecen todos los clientes del mes 07, pero al agregar el resto del codigo me marca la siguiente linea:

Cita:
Subquery returns more than 1
Ademas de qe falto un ) y lo pose doble al final antes del ; espero lo haya puesto bien

Y ps sobre las condiciones, no hay ninguna en especial, solo usar las subconsultas en ambas consultas
  #8 (permalink)  
Antiguo 13/06/2009, 17:15
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: Consultas MySQL

Pruebalo con ANY:
Código sql:
Ver original
  1. SELECT nombre
  2. FROM clientes
  3. WHERE cve_clientes ANY (SELECT cve_clientes
  4.     FROM `ventas`
  5.     WHERE MONTH( fecha ) =7);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 13/06/2009, 18:41
 
Fecha de Ingreso: mayo-2009
Mensajes: 12
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: Consultas MySQL

El codigo qe me paso Jurena esta bien, solo qe al agregar las lineas d rojo me marca el error qe puse anteriormente


SELECT nombre
FROM clientes
WHERE cve_clientes
IN (
SELECT cve_clientes
FROM `ventas`
WHERE month( fecha ) =7
(
SELECT cve_producto
FROM productos
WHERE nombre = 'sabritas' )
  #10 (permalink)  
Antiguo 13/06/2009, 20:09
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: Consultas MySQL

No tiene mucho sentido ese error, porque el caso cumple perfectamente con el estándar.
De todos modos hay una forma más optimizada para esa consulta y es:
Código sql:
Ver original
  1. SELECT c.nombre
  2. FROM clientes c INNER JOIN ventas v USING(cve_clientes)
  3. WHERE MONTH(v.fecha) = 7;

que en el otro caso sería:
Código sql:
Ver original
  1. SELECT c.nombre
  2. FROM clientes c INNER JOIN ventas v USING(cve_clientes) INNER JOIN productos p USING(cve_producto)
  3. WHERE MONTH(v.fecha) = 7 AND p.nombre = 'sabritas';
Hay que notar que MySQL no puede optimizar un filtro en el WHERE, pero si puede optimizar el FROM...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 13/06/2009, 23:54
 
Fecha de Ingreso: mayo-2009
Mensajes: 12
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: Consultas MySQL

Gracias x la ayuda gnzsoloyo, pero como dije no puedo usar el Inner Join
  #12 (permalink)  
Antiguo 14/06/2009, 00:21
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consultas MySQL

CarloosN,
Creo que gnzsoloyo tiene razón y que esa es la consulta, y tú estás confundiendo la prohibición de usar inner join en lugar de la subconsulta con usarlo siempre: lo que no quiere tu profesor es que lo uses en lugar de esta subconsulta. Por lo que si usas la subconsulta, no creo que te esté prohibiendo unir mediante inner join el primer cruce. Eso creo. De todas formas, deberías preguntárselo.
No obstante, y si te empeñas en evitar escribirlo, puedes hacer la union del primer cruce con where e igual, así:
Código sql:
Ver original
  1. SELECT nombre
  2. FROM clientes
  3. WHERE cve_clientes
  4. IN (
  5. SELECT ventas.cve_clientes
  6. FROM ventas, productos
  7. WHERE productos.cve_producto = ventas.cve_producto AND MONTH(fecha) = 7 AND
  8. productos.nombre LIKE '%sabritas%')
Yo pondría las dos consultas y diría que es más eficiente y estándar el inner join en el primer cruce, empleando USING. Sería ésta:
Código sql:
Ver original
  1. SELECT nombre
  2. FROM clientes
  3. WHERE cve_clientes
  4. IN (
  5. SELECT ventas.cve_clientes
  6. FROM ventas INNER JOIN productos
  7. USING (cve_producto) WHERE MONTH(fecha) = 7 AND
  8. productos.nombre LIKE '%sabritas%')

La otra la haría sin subconsulta, y en este caso evitando usar INNER JOIN:
Código sql:
Ver original
  1. SELECT clientes.nombre, COUNT(*) total_ventas FROM ventas, clientes WHERE ventas.cve_clientes = clientes.cve_clientes GROUP BY ventas.cve_clientes

Pero mejor con inner join y using
Código sql:
Ver original
  1. SELECT clientes.nombre, COUNT(*) total_ventas FROM ventas INNER JOIN clientes USING (cve_clientes) GROUP BY ventas.cve_clientes

Última edición por jurena; 14/06/2009 a las 01:08
  #13 (permalink)  
Antiguo 14/06/2009, 00:25
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: Consultas MySQL

Entonces esto debería haberte funcionado:
Código sql:
Ver original
  1. SELECT nombre
  2. FROM clientes
  3. WHERE cve_clientes ANY (SELECT cve_clientes
  4.     FROM `ventas`
  5.     WHERE MONTH(fecha) = 7
  6.         AND cve_producto IN (SELECT cve_producto
  7.                              FROM producto
  8.                              WHERE nombre = 'sabrita')
  9.     );

No hay razones para que te devuelva un error como el que dices, el cual sólo aparece cuando en vez de IN pones "="...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 14/06/2009, 00:33
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: Consultas MySQL

Confirmo mi sospecha. En este segmento de tu post:
Cita:
select nombre from clientes where cve_cliente=(select cve_cliente from ventas where cve_producto=(select cve_producto from productos where nombre like "%sabritas%"));
la segunda subconsulta tiene un LIKE, pero estás buscando los códigos por igual a.
El error lógico es que si usas LIKE hay que suponer (forzosamente) que puede devolver uno o más registros, y en ese contexto no puedes usar igual (=), sino IN...

Usala así:
Código sql:
Ver original
  1. SELECT nombre
  2. FROM clientes
  3. WHERE cve_clientes ANY (SELECT cve_clientes
  4.     FROM `ventas`
  5.     WHERE MONTH(fecha) = 7
  6.         AND cve_producto IN (SELECT cve_producto
  7.                              FROM producto
  8.                              WHERE nombre LIKE '%sabrita%')
  9.     );

Respecto a esta consulta:
Cita:
2. seleccionar el nombre del cliente y la cantidad de veces que este ha realizado una venta.
No se puede realizar de una forma decente sin usar al menos un JOIN, porque la cantidad de compras la tienes en una tabla y el nombre en la otra....
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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:14.