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

empezando con joins

Estas en el tema de empezando con joins en el foro de Mysql en Foros del Web. Hola, estoy empezando a utilizar joins y necesito que me ayudeis en esta consulta que hago, seguro que tiene que ver con el operador logico ...
  #1 (permalink)  
Antiguo 27/01/2009, 04:32
 
Fecha de Ingreso: junio-2007
Ubicación: Cádiz
Mensajes: 369
Antigüedad: 16 años, 10 meses
Puntos: 7
empezando con joins

Hola, estoy empezando a utilizar joins y necesito que me ayudeis en esta consulta que hago, seguro que tiene que ver con el operador logico "OR", pero es que no se como hacer, para que coja en cada caso, los que se correspondan con el id de ese pedido....


SELECT tpedidos.Id AS Id, tpedidos_gen_per.inf03 AS inf03, tpedidos_gen_per.inf34 AS inf34, tpedidos_gen_per.inf45 AS inf45, tpedidos_gen_per.primaria AS primaria, tpedidos_gen_per.secundaria AS secundaria, tpedidos_gen_per.bachillerato AS bachillerato, tpedidos_completos.Cantidad AS cantidad_completas FROM tpedidos INNER JOIN tpedidos_gen_per INNER JOIN tpedidos_completos WHERE tpedidos_gen_per.Id_pedido = Id OR tpedidos_completos.Id_pedido = Id




quiero me seleccione en la primera fila solo el valor de cantidad, que es el que se correponde con el id de ese pedido y en la segunda, los otros 6 pero que cantidad aparezca 0 ya que no hay cantidad para ese pedido...tiene que ser sencillo pero no lo veo...gracias anticipadas...!!
  #2 (permalink)  
Antiguo 27/01/2009, 05:07
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: empezando con joins

Un INNER JOIN, LEFT JOIN o RIGHT JOIN, requiere una clausula USING o una cláusula ON tabla1.campoA = tabla2.campoB.
Esto significa que la consulta en cuestión debería ser:
Código sql:
Ver original
  1. SELECT
  2.     tpedidos.Id Id,
  3.     tpedidos_gen_per.inf03 inf03,
  4.     tpedidos_gen_per.inf34 inf34,
  5.     tpedidos_gen_per.inf45 inf45,
  6.     tpedidos_gen_per.primaria primaria,
  7.     tpedidos_gen_per.secundaria secundaria,
  8.     tpedidos_gen_per.bachillerato bachillerato,
  9.     tpedidos_completos.Cantidad cantidad_completas
  10. FROM tpedidos
  11.     INNER JOIN tpedidos_gen_per ON tpedidos.Id = tpedidos_gen_per.Id_pedido
  12.     INNER JOIN tpedidos_completos  ON tpedidos.Id = tpedidos_completos.Id_pedido;

En este contexto, solamente te mostrará los registros donde
Cita:
tpedidos.Id = tpedidos_gen_per.Id_pedido= tpedidos_completos.Id_pedido
En el caso tuyo, el problema es que no está muy claro cómo es el problema completo.
¿Podrías aclarar un poco en qué consiste la tarea y cómo son las tablas que se involucran?

Sugerencia final:
1. La cláusula AS es opcional desde hace años (SQL-1999:2000), y solamente se conserva por compatibilidad con versiones muy viejas. No hace falta para que funcione.
2. Trata de acomodar la sentencia en una forma estructurada. Hace que sea más fácil leerla.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 27/01/2009, 05:22
 
Fecha de Ingreso: junio-2007
Ubicación: Cádiz
Mensajes: 369
Antigüedad: 16 años, 10 meses
Puntos: 7
Respuesta: empezando con joins

Muchas gracias por tus consejos, pero esta que me indicas devuelve vacio...
  #4 (permalink)  
Antiguo 27/01/2009, 05:32
 
Fecha de Ingreso: junio-2007
Ubicación: Cádiz
Mensajes: 369
Antigüedad: 16 años, 10 meses
Puntos: 7
Respuesta: empezando con joins

Perdona, no leí donde decías que explicara en qué consistía....

Necesito recoger una serie de valores dependiendo de si el pedido es personalizado o generico (inf03, inf34, inf45, primaria, secundaria, bachillerato) o de sí es completo (Cantidad), hay 3 tablas, una pedido que alberga datos del cliente y que da id al pedido y las otras 2 que son referente al tipo de pedido, entonces por cada fila que encuentre la consulta, en una recibire valores para un tipo de pedido y en otras para los de otros, pero nunca en una fila (id de un pedido) podran venir valores para ambos tipos de pedidos....p.e.:

pedidos

id---tipo
4---generico
5---completo
6---personalizado

pedidos_genericos_personalizados

id_pedido ---inf03--inf34---inf45---prim---sec---bach

4--------------40-----20------30-------50-----50----30
6--------------20-----30-------10------50------40----20


pedidos_completo

id_pedido cantidad ......
5-------------50


Entonces quiero recorrer al final un arreglo que muestre el total de inf03,inf34,inf45, prim, secu,bach y cantidad...me he explicado bien??
  #5 (permalink)  
Antiguo 27/01/2009, 05: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: empezando con joins

Se comprende.
Básicamente lo que quieres es un reporte que te muestre el resumen (suma total) de cada estado de los campos de todos los pedidos ingresados.
La cosa tiene un par de tips al menos:

1. No te sirve usar INNER JOIN porque INNER JOIN exige que haya una correspondencia 1:1:1 en las tres tablas, eso es, los campos usados de enlace deben estar igualados en las tres tablas, y en el ejemplo que das, en una hay un ID=5 y en otra no.
2. Para que se comprenda por qué no devuelve datos, hay que recordar que toda operación comparativa, aritmética o lógica donde uno de los valores sea NULL devuelve NULL para todo el resultado. Como el cruce de dos tablas devuelve NULL, no importa si cada una de ellas por separado se puede igualar a la tabla primaria pedidos, de todos modos la respuesta es NULL:
3. Para poder administrar el NULL de un JOIN hay que usar LEFT JOIN o RIGHT JOIN, donde la respuesta a la consulta se hace sobre la base de la tabla a la izquierda (LEFT) del JOIN o a la derecha (RIGHT) del mismo.
4. En cualquier caso vas a tener registros donde el valor en los campos sea NULL, lo que trae el problema que si sumas 50 + NULL esto es NULL. En ese caso se soluciona con una función de SQL: IFNULL(). La forma de solucionarlo sería: SUM(IFNULL(campo,0)), y esa sería la operación por cada uno de los campos donde el NULL pueda aparecer.
5. No te olvides que si quieres la sumatoria de campos individuales, esa consulta devuelve siempre un sólo registro, a menos que realices agrupamientos por un campo para ver los subtotales.

Una consulta aproximada sería:
Código sql:
Ver original
  1. SELECT
  2.     tpedidos.Id Id,
  3.     SUM(IFNULL(tpedidos_gen_per.inf03,0)) inf03,
  4.     SUM(IFNULL(tpedidos_gen_per.inf34,0)) inf34,
  5.     SUM(IFNULL(tpedidos_gen_per.inf45,0)) inf45,
  6.     SUM(IFNULL(tpedidos_gen_per.primaria,0)) primaria,
  7.     SUM(IFNULL(tpedidos_gen_per.secundaria,0)) secundaria,
  8.     SUM(IFNULL(tpedidos_gen_per.bachillerato,0)) bachillerato,
  9.     SUM(IFNULL(tpedidos_completos.Cantidad,0)) cantidad_completas
  10. FROM tpedidos
  11.     LEFT JOIN tpedidos_gen_per ON tpedidos.Id = tpedidos_gen_per.Id_pedido
  12.     LEFT JOIN tpedidos_completos  ON tpedidos.Id = tpedidos_completos.Id_pedido
  13.     GROUP BY ID;
Estoy agrupando para hacer una discriminación por ID de pedido. Si lo que se pretende es una síntesis completa, entonces no se puede usar ese campo, porque se suprimiran las variaciones al usar funciones agregadas.
__________________
¿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 00:11.