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

Select dentro de if dentro de select??

Estas en el tema de Select dentro de if dentro de select?? en el foro de Mysql en Foros del Web. Haber si me consigo explicar: Tengo un formulario de busqueda con 3 campos (por fecha, por materia y por lugar). Como mínimo hay que rellenar ...
  #1 (permalink)  
Antiguo 23/01/2009, 06:43
 
Fecha de Ingreso: marzo-2008
Ubicación: Cádiz, España
Mensajes: 89
Antigüedad: 16 años, 2 meses
Puntos: 0
Select dentro de if dentro de select??

Haber si me consigo explicar:

Tengo un formulario de busqueda con 3 campos (por fecha, por materia y por lugar). Como mínimo hay que rellenar un campo para la busqueda. Se puede buscar por tres tipos (exacta, contiene y empieza por).

En esta consulta (de tipo empieza por), me muestra mas resultados de los debidos.

Código PHP:
select distinct from mapas m JOIN signaturasoriginales s on s.mapaid=m.mapaid JOIN materias mat on mat.materiaid=m.materiaid JOIN lugargeosec l on l.mapaid m.mapaid JOIN autores a on a.mapaid m.mapaid WHERE m.mapaid=s.mapaid AND m.materiaid=mat.materiaid AND m.mapaid=l.mapaid AND m.mapaid=a.mapaid AND m.lugargeografico like '%' OR l.lugar like '%' OR m.fecha like '%' OR mat.materia like '%' OR a.autor like '%autor1' 
En esta que he puesto, tanto lugargeografico,lugar,fecha y materia no tienen datos (no los he metido en el formulario), pero me muestra los mapas de mas autores.

Como puedo hacer la consulta para que si no meto valores en el formulario no me haga la consulta teniendo en cuenta esos valores.

Muchas gracias de antemano.
  #2 (permalink)  
Antiguo 23/01/2009, 07:13
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: 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)
  #3 (permalink)  
Antiguo 23/01/2009, 07:24
 
Fecha de Ingreso: marzo-2008
Ubicación: Cádiz, España
Mensajes: 89
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: Select dentro de if dentro de select??

Muchisimas gracias por tu respuesta. Los Join los meti despues y se me ha pasado quitar las relaciones.

y el tema del formulario, lo hare por código. No se como se me ha podido ocurrir acceder a traves de la sql.

Gracias de nuevo.
  #4 (permalink)  
Antiguo 23/01/2009, 07: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: Select dentro de if dentro de select??

Cita:
Iniciado por BORJACONIL Ver Mensaje
Muchisimas gracias por tu respuesta. Los Join los meti despues y se me ha pasado quitar las relaciones.

y el tema del formulario, lo hare por código. No se como se me ha podido ocurrir acceder a traves de la sql.

Gracias de nuevo.
Eventualmente podrías haberlo hecho, por SP, como dije, pero al final lo único que lograbas es pasar una lógica programada de una parte a la otra, sin ahorrar ningún esfuerzo, con el agravante que construir esa sentencia es más fácil en la aplicación.
Yo lo hago habitualmente en VB.Net, y me he encontrado que en definitiva, esas decisiones salen mejor desde la aplicación. No así aquellas decisiones que dependen del resultado de una selección de datos. La mayoría de esas es mejor administrarlas en SQL.
Corolario: Cada lenguaje y cada aplicación tiene su area de mayor potencia. Aprovéchala.
__________________
¿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 26/01/2009, 01:26
 
Fecha de Ingreso: marzo-2008
Ubicación: Cádiz, España
Mensajes: 89
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: Select dentro de if dentro de select??

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Eventualmente podrías haberlo hecho, por SP, como dije, pero al final lo único que lograbas es pasar una lógica programada de una parte a la otra, sin ahorrar ningún esfuerzo, con el agravante que construir esa sentencia es más fácil en la aplicación.
Yo lo hago habitualmente en VB.Net, y me he encontrado que en definitiva, esas decisiones salen mejor desde la aplicación. No así aquellas decisiones que dependen del resultado de una selección de datos. La mayoría de esas es mejor administrarlas en SQL.
Corolario: Cada lenguaje y cada aplicación tiene su area de mayor potencia. Aprovéchala.
Bueno pues problema resuelto. Tengo 12 tipos de consulta (12 por haber 4 campos en el formulario) por cada tipo de busqueda. Al haber 3 tipos de busqueda (exacta, empieza por y contiene). Total, 36 select distintos, pero cada uno por el campo del formulario que se ha rellenado.

Funciona perfectamente.

Gracias de nuevo.

Última edición por BORJACONIL; 26/01/2009 a las 03:41
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 01:39.