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

left join

Estas en el tema de left join en el foro de Mysql en Foros del Web. Muy buenas, espero que em ayuden porque soy medio nuevo en esto. He estado leyendo e intentado hacerlo pero no me sale; Tengo una base ...
  #1 (permalink)  
Antiguo 03/12/2012, 11:43
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 11 años, 5 meses
Puntos: 1
left join

Muy buenas, espero que em ayuden porque soy medio nuevo en esto.

He estado leyendo e intentado hacerlo pero no me sale; Tengo una base de datos con estas tablas:

Instrumentos:Cod_instrumento, modelo, tipo, precio
factura:Cod_factura, fecha, codigo(clave foranea de Cod_instrumento)

Bien, quería hacer una consulta para uqe el usuario pudiese sacar una lista de ventas por trimestres: por ejemploe que sacase todo lo que vende en agosto, septiembre y octubre.

Código MySQL:
Ver original
  1. SELECT DISTINCT codigo, Cod_instrumento
  2. FROM instrumentos, factura
  3. WHERE Cod_instrumento=codigo AND Tipo='guitarra electrica' and fecha like '%2012-08-%' or fecha like '%2012-09-%' ORDER BY Marca
El problema es que el resultado que me muestra es repetido, quiero decir, me hace un producto cartesiano y me saca el cod_instrumento varias veces.

Me han dicho que pruebe con left join, pero no consigo hacerlo, a ver si pueden ayudarme.

Muchas gracias

Última edición por gnzsoloyo; 04/12/2012 a las 06:41 Razón: Código SQL mal etiquetado.
  #2 (permalink)  
Antiguo 03/12/2012, 12:14
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: left join

Prueba con esto:
Código MySQL:
Ver original
  1. FROM instrumentos INNER JOIN factura ON cod_instrumento = codigo
Saludos!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #3 (permalink)  
Antiguo 04/12/2012, 05:34
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 11 años, 5 meses
Puntos: 1
Respuesta: left join

De acuerdo, he completado la consulta con lo que me has dicho, y ya no multiplica datos, pero me saca por pantalla todas las ventas de todos los tipos de instrumentos cuando yo selecciono solo un tipo:

Código MySQL:
Ver original
  1. FROM instrumentos
  2.     INNER JOIN factura ON Cod_instrumento = codigo
  3. where Tipo='guitarra electrica' and fecha like '%2012-08-%' or fecha like '%2012-09-%' or fecha like '%2012-10-%' order by Marca
Lo de la fecha si funciona, pero no el tipo de intrumento, puesto que en la salida me saca guitarra electrica, teclados, baterías...

Última edición por gnzsoloyo; 04/12/2012 a las 06:18 Razón: Código SQL mal etiquetado
  #4 (permalink)  
Antiguo 04/12/2012, 06:38
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: left join

El problema es simple, pero no es el único problema.
Lo que sucede es que no estás escribiendo bien las condiciones del WHERE, o no manejas correctamente la lógica proposicional.
Un OR es una clausula disyuntiva, es decir que parte en dos las condiciones enunciadas, donde cada parte de las condiciones se evalúa como TRUE/FASE por si misma. Esto hace que además sea incluyente, si cada una de las condiciones es TRUE, el resultado de esa condición se incluye en el resultado final.
Tal y como lo escribiste:
Código MySQL:
Ver original
  1. FROM instrumentos
  2.     INNER JOIN factura ON Cod_instrumento = codigo
  3.     Tipo='guitarra electrica'
  4.     and fecha like '%2012-08-%'
  5.     or fecha like '%2012-09-%'
  6.     or fecha like '%2012-10-%'
  7. order by Marca
lo que le pides al MySQ es que te devuelva:
1) Los registros que contengan "guitarra electrica" y la fecha sea de agosto de este año.
2) Todos los registros de septiembre de este año.
3) Todos los registros de octubre de este año.

Como ves, en los últimos tres casos no estás discriminando si el tipo es o no una guitarra eléctrica...

Ese problema se resuelve muy fácilmente: Las tres condiciones de fecha se ponen entre paréntesis para que se consideren como unidad lógica:
Código MySQL:
Ver original
  1. FROM instrumentos
  2.     INNER JOIN factura ON Cod_instrumento = codigo
  3.     Tipo='guitarra electrica'
  4.     and (fecha like '%2012-08-%'
  5.     or fecha like '%2012-09-%'
  6.     or fecha like '%2012-10-%')
  7. order by Marca
ASí si funcionaría.
Pero no es el único error de lógica. El segundo, más grave es que no se usa el LIKE para buscar fechas. Jamás.
El LIKE es para búsquedas de cadenas de texto, no para fechas. Una fecha no es una cadena de texto y al usar el LIKE debe ser convertida a texto, lo cual no es ni necesario ni una buena idea.
Una fecha es un escalar, no un texto. Es una magnitud y como tal susceptible de ser medida y comparada por rangos, por lo que se debe usar otro tipo de operadores para hacerlo.

En este caso, lo que correspondería sería:

Código MySQL:
Ver original
  1. FROM instrumentos
  2.     INNER JOIN factura ON Cod_instrumento = codigo
  3.     Tipo='guitarra electrica'
  4.     AND YEAR(fecha)=2012
  5.     AND MONTH(fecha) IN(8, 9, 10)
  6. ORDER BY Marca
o bien

Código MySQL:
Ver original
  1. FROM instrumentos
  2.     INNER JOIN factura ON Cod_instrumento = codigo
  3.     Tipo='guitarra electrica'
  4.     AND YEAR(fecha)=2012
  5.     AND MONTH(fecha) BETWEEN 8 AND 10
  6. ORDER BY Marca
Como puedes suponer, YEAR() devuelve el año de una fecha y MONTH el numero de mes. Tan sencillo como eso.
De hecho, la consulta también podría escribirse:
Código MySQL:
Ver original
  1. FROM instrumentos
  2.     INNER JOIN factura ON Cod_instrumento = codigo
  3.     Tipo='guitarra electrica'
  4.     fecha BETWEEN '2012-08-01' AND '2012-10-31'
  5. ORDER BY Marca

Posdata: No etiquetes el código SQL como PHP, no es lo mismo.
En el combo de los Highlights están las etiquetas correctas. Úsalas.
__________________
¿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 04/12/2012, 07:39
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 11 años, 5 meses
Puntos: 1
Respuesta: left join

Muchisimas gracias!!!

Conozco todas las sintaxis que me comentas, el problemaa es que no se usarlas bien todavía jajajajaj. Pero me has ayudado mucho, muchisimas gracias!!

Etiquetas: join, left, tabla, usuarios
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 11:33.