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

Se podrá Evitar Consultas Anidadas ? ? ?

Estas en el tema de Se podrá Evitar Consultas Anidadas ? ? ? en el foro de Mysql en Foros del Web. Saludos . . . Me gusta participar y preguntar en éste Foro porque cada día aprendemos algo nuevo . . . El día de hoy ...
  #1 (permalink)  
Antiguo 14/05/2009, 15:29
 
Fecha de Ingreso: agosto-2008
Mensajes: 82
Antigüedad: 15 años, 8 meses
Puntos: 4
Se podrá Evitar Consultas Anidadas ? ? ?

Saludos . . .

Me gusta participar y preguntar en éste Foro porque cada día aprendemos algo nuevo . . .

El día de hoy me preguntaba si podía optimizar una consulta para mostrar lo que necesito hacer con consultas anidadas . . .

vayamos al ejemplo . . .

Tengo Mis Columnas: Nombre, ID_Articulo, Fecha, Importe

Ahora . . . sucede que la misma persona compra varios artículos . . . al final necesito saber el nombre de las personas, con el listado de artículos comprados y el total . . .

--------------------------------------------------------------
|NOMBRE | ID_ARTICULO | FECHA | IMPORTE |
--------------------------------------------------------------
| X | 0000000001 | 00/00/00 | $100 |
| X | 0000000012 | 00/00/00 | $1000 |
| X | 0001239192 | 00/00/00 | $900 |
--------------------------------------------------------------
| TOTAL $2000 |


Y una parecida para cada persona que compró . . . .
si se podrán sacar los datos en una sóla consulta ó forzosamente tengo que anidarlas ? ? ?

Por su atención y respuestas . . . muchas grax
  #2 (permalink)  
Antiguo 14/05/2009, 16:15
Avatar de cala932  
Fecha de Ingreso: septiembre-2006
Ubicación: San Juan-Argentina
Mensajes: 902
Antigüedad: 17 años, 7 meses
Puntos: 9
Respuesta: Se podrá Evitar Consultas Anidadas ? ? ?

HOlas, haber si entendi bien, esa tabla que muestras es la de articulos y supongo que tienes una tabla intermedia que te relaciona los articulos con las personas, ya que un articulo puede ser comprado por mas de una persona y esa persona puede comprar mas de un articulo. Partiendo de ahi, es decir si tienes armada las estructuras de esa manera, tienes que hacer un JOIN entre dichas tablas. Sino postea las tablas restantes para poder ayudarte mejor.

SAludos
__________________
->Aprender es un proceso que incluye el error..
  #3 (permalink)  
Antiguo 14/05/2009, 16:32
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: Se podrá Evitar Consultas Anidadas ? ? ?

En esencia, las consultas anidadas se pueden evitar siempre y cuando, como dice cala932, se pueda resolver por medio de un JOIN, INNER JOIN, LEFT JOIN o RIGHT JOIN.
En realidad, las consultas anidadas tienen más sentido no para realizar busquedas de datos, sino para establecer filtrados sucesivos de un conjunto de datos de varias tablas, donde las más internas son casi siempre JOINS que restringen los datos que se leen con determinados criterios.
En ese contexto, las sucesivas subconsultas crean tablas virtuales con menores cantidades de registros, las que se pueden combinar y filtrar más aún, para obtener finalmente los reportes deseados.
Ese es en alguna forma el sentido de la optimización: reducir los registros leidos a los esenciales.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 14/05/2009, 16:50
 
Fecha de Ingreso: agosto-2008
Mensajes: 82
Antigüedad: 15 años, 8 meses
Puntos: 4
Respuesta: Se podrá Evitar Consultas Anidadas ? ? ?

Muchas gracias por las respuestas . . . los JOINS los tengo muy presentes . . .

Pero aquí a lo que me refería . . . el Total obtenido "SUM(importe)" por cada persona necesito barrerlo tal cual nos muestra la tabla . . .

Y ésa tablita repetirla para cada persona que se registró "x" día . . .

La tabla tal cual se muestra es barrida con "For/Next" . . .

Pero viendolo bien . . . no creo sea posible . . . :( . . . al parecer el total debo sacarlo al barrer los resultados . . .
  #5 (permalink)  
Antiguo 14/05/2009, 19:16
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: Se podrá Evitar Consultas Anidadas ? ? ?

Por empezar, el For/Next no existe en una consulta SQL. Sí existen iteraciones en los store procedures, pero so innecesarios en este caso.
Según entiendo, lo que quieres hacer es obtener para un cliente, el listado completo de productos que compró, con la suma total se compras del cliente. ¿Es así?
Ese tipo de consultas son simples, se hacen por agrupamiento, y si no las quieres paginadas, sino como reporte global, es fácil.
Un reporte discriminado por artículo, con la suma de compras por cliente, mas la suma total de ventas sería mas o menos así:
Código SQL:
Ver original
  1. SELECT NOMBRE, ID_ARTICULO, COUNT(*) CANTIDAD, FECHA, SUM(IMPORTE) IMPORTE
  2. FROM VENTAS
  3. GROUP BY NOMBRE, ID_ARTICULO WITH ROLLUP;
Esto debería devolverte un listado de todos los clientes con los artículos que compró, sus cantidades discriminadas y la suma pagada por cada tipo, más una línea donde esté es subtotal (separando cada cliente ) y una línea de subtotal.
Para hacer un reporte mejor, hay que hacerlo con subconsultas forzosamente, pero para darte sugerencias deberías postear la estructura de tablas involucradas y darnos una idea de qué es lo que debe mostrar exactamente el reporte.
De todos modos quería que vieras que ciertas cosas se pueden hacer sin demasiadas complicaciones desde la misma base.
__________________
¿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 12:49.