Consulta con un numero variable de condiciones

Iniciado por santi810, 22 Agosto 2014, 22:58 PM

0 Miembros y 1 Visitante están viendo este tema.

santi810

Buenos dias.

Empiezo presentando mi tabla:
-- Estructura de tabla para la tabla `extras`
--

CREATE TABLE IF NOT EXISTS `extras` (
  `usuario` varchar(30) COLLATE utf8_spanish2_ci NOT NULL,
  `extraID` int(11) NOT NULL AUTO_INCREMENT,
  `fecha` date NOT NULL,
  `local` varchar(30) COLLATE utf8_spanish2_ci NOT NULL,
  `tempo` int(2) NOT NULL,
  `precio` decimal(5,2) NOT NULL,
  `notas` text COLLATE utf8_spanish2_ci NOT NULL,
  `pago_asoc` char(1) COLLATE utf8_spanish2_ci NOT NULL DEFAULT 's',
  `propina` decimal(5,2) NOT NULL DEFAULT '0.00',
  PRIMARY KEY (`extraID`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci AUTO_INCREMENT=24 ;



Desde una aplicacion web estoy intentando hacer una SELECT filtrando por 3 variables ( usuario, local y año)
En teoria seria lo siguiente:
select * from extras WHERE YEAR(fecha) = '2014' AND pago_asoc = '*' AND local = 'Casa' AND usuario = 'Santi'

El problema es que no siempre se dan los 3 parametros desde la aplicacion.
Por ejemplo a veces necesito conocer las extras de Santi en 2014 en TODOS LOS LOCALES.
Habia pensado en esto:
select * from extras WHERE YEAR(fecha) = '2014' AND pago_asoc = '*' AND local = '*' AND usuario = 'Santi'
pero por las pruebas que he echo el * no funciona en los WHERE (lo que tiene todo el sentido del mundo desde mi punto de vista)

Si conocen algun tipo de forma para arreglar esto os lo agradezco. Estoy intentando arreglarlo desde el apartado de php pero desde ahi lo veo mas complicado.

Gracias de antemano.

madara1412

select * from extras WHERE YEAR(fecha) = '2014' AND pago_asoc = '*' AND usuario = 'Santi'

como nesesitas saber todos los locales lo ideal es no poner condicion al quitar la condicion de local se asume que seran todos que cumplan las condiciones como 2014 y santi

santi810

era un ejemplo, otras veces necesitare saber las extras de todos los usuarios en local=casa durante el 2014, y otras las de santi en casa etc

Carloswaldo

¿De qué gestor de base de datos estamos hablando? Voy a asumir MySQL.

Podrías intentar hacer algo como esto, por ejemplo:

Código (sql) [Seleccionar]
SELECT * FROM extras WHERE (@local IS NULL OR local = @local)

Eso te retornará todos los registros en el caso de que @local no esté definido (sea null) y aplicará el filtro en caso de que sí esté definido.

También puedes simplificarlo un poco con COALESCE

Código (sql) [Seleccionar]
SELECT * FROM extras WHERE local = COALESCE(@local,local)

Siguiendo esa lógica puedes construir el resto de la consulta.

JorgeEMX

Cita de: santi810 en 22 Agosto 2014, 22:58 PM
Si conocen algun tipo de forma para arreglar esto os lo agradezco. Estoy intentando arreglarlo desde el apartado de php pero desde ahi lo veo mas complicado.

Ps más bien, a mi me parece una tontera hacer un consulta muy general para estos casos. Los mejor sería sacar una consulta a medida desde PHP.

Si el campo local siempre lleva un tipo de local, que no sea vacío, sería (como te comentan arriba):

Código (sql) [Seleccionar]
select * from extras WHERE YEAR(fecha) = '2014' AND local IS NOT NULL AND usuario = 'Santi'

Tal vez hasta te interese agruparlo:

Código (sql) [Seleccionar]
select * from extras WHERE YEAR(fecha) = '2014' AND local IS NOT NULL AND usuario = 'Santi' group by local

Lo mismo aplica para la otra variable. El problema de hacer esto, es que a nivel de código deberás identificar que sentencia llamar.

Carloswaldo

El problema con eso es que el código en php va a ser muy extenso porque tendrá que hacer una consulta por cada situación (una para cuando no hayan todos los datos, otra cuando falte fecha, otra cuando falte fecha y local, otra cuando falte solo local, etc...)

Ya depende de lo que le venga a ser más práctico.