Tema: left join
Ver Mensaje Individual
  #4 (permalink)  
Antiguo 04/12/2012, 06:38
Avatar de gnzsoloyo
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)