Ver Mensaje Individual
  #2 (permalink)  
Antiguo 23/01/2009, 07:13
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: 17 años, 3 meses
Puntos: 2658
Respuesta: Select dentro de if dentro de select??

Vamos por partes.

1. Esta consulta:
Código sql:
Ver original
  1. SELECT DISTINCT *
  2. FROM mapas m
  3.   JOIN signaturasoriginales s ON s.mapaid=m.mapaid
  4.   JOIN materias mat ON mat.materiaid=m.materiaid
  5.   JOIN lugargeosec l ON l.mapaid = m.mapaid
  6.   JOIN autores a ON a.mapaid = m.mapaid
  7. WHERE m.mapaid=s.mapaid AND
  8.   m.materiaid=mat.materiaid AND
  9.   m.mapaid=l.mapaid AND
  10.   m.mapaid=a.mapaid AND
  11.   m.lugargeografico LIKE '%'
  12.     OR l.lugar LIKE '%'
  13.     OR m.fecha LIKE '%'
  14.     OR mat.materia LIKE '%'
  15.     OR a.autor LIKE '%autor1';
es redundante e ineficiente. Esta haceiendo dos veces la misma relación en forma innecesaria.
Una sintaxis simplificada sería:

Código sql:
Ver original
  1. SELECT DINSTINCT *
  2. FROM mapas m
  3.   INNER JOIN signaturasoriginales s ON s.mapaid=m.mapaid
  4.   INNER JOIN materias mat ON mat.materiaid=m.materiaid
  5.   INNER JOIN lugargeosec l ON l.mapaid = m.mapaid
  6.   INNER JOIN autores a ON a.mapaid = m.mapaid
  7. WHERE
  8.    m.lugargeografico LIKE '%'
  9.     OR l.lugar LIKE '%'
  10.     OR m.fecha LIKE '%'
  11.     OR mat.materia LIKE '%'
  12.     OR a.autor LIKE '%autor1';

Esta parte:
Cita:
m.lugargeografico like '%'
OR l.lugar like '%'
OR m.fecha like '%'
OR mat.materia like '%'
no parece tener sentido. Porque lo que indica es que ponga los registros sea cual fuere el valor que esté allí, aunque para eso mismo está mal construida.

2. El problema que planteas:
Cita:
Como puedo hacer la consulta para que si no meto valores en el formulario no me haga la consulta teniendo en cuenta esos valores.
no se puede resolver por la consulta. Eso lo tienes que definir en la aplicación, de modo de enviar dos consultas distintas según tengas o no valores de comparación. No hay otro modo.
En caso contrario, deberías resolverlo por medio de un strore procedure... que haría exactamente eso. Tiempo desperdiciado: Hazlo en la aplicación y será más sencillo.
La idea es que hagas un procedimiento que construya la sentencia incluyendo o no el WHERE, según vayas a comparar o no contra un valor obtenido, y recién entonces la envíes a ejecutar.

Finalmente, una sintaxis más limpia de lo que has puesto sería:
Código sql:
Ver original
  1. SELECT DINSTINCT *
  2. FROM mapas m
  3.   INNER JOIN signaturasoriginales s USING(mapaid)
  4.   INNER JOIN materias mat USING(mapaid)
  5.   INNER JOIN lugargeosec l USING(mapaid)
  6.   INNER JOIN autores a USING(mapaid)
  7. WHERE
  8.    m.lugargeografico LIKE '%'
  9.     OR l.lugar LIKE '%'
  10.     OR m.fecha LIKE '%'
  11.     OR mat.materia LIKE '%'
  12.     OR a.autor LIKE '%autor1';
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)