mysql - español - O conflicto entre otras condiciones
select date sql server (4)
Tengo la siguiente consulta:
SELECT * FROM `Contacts`
WHERE `Zona` = ''1''
AND `Responsable` = ''9''
AND `AllowComercialVisit` = ''Call_Again''
-- the problem are OR''s --
OR `AllowComercialVisit` = ''Busy''
OR `AllowComercialVisit` = ''Not_answered''
-- the problem are OR''s --
AND `DateRecall` <= ''2016-06-20 13:04:52''
AND `DateRecall` >= ''2016-06-20 12:39:52''
ORDER BY `DateRecall` ASC LIMIT 1
El problema es que la consulta SOLO debe mostrar las filas entre la primera y la segunda ''DateRecall'', pero debe devolver todas las filas con ''Call_Again'', ''Busy'' y ''Not_answered'' sin filtrar la fecha.
Cualquier solución será apreciada!
Intente agrupar las sentencias OR ya que están relacionadas con la misma columna, es decir,
SELECT * FROM `Contacts`
WHERE `Zona` = ''1''
AND `Responsable` = ''9''
AND (`AllowComercialVisit` = ''Call_Again''
OR `AllowComercialVisit` = ''Busy''
OR `AllowComercialVisit` = ''Not_answered'' )
AND `DateRecall` <= ''2016-06-20 13:04:52''
AND `DateRecall` >= ''2016-06-20 12:39:52''
ORDER BY `DateRecall` ASC LIMIT 1
Pruebe la siguiente consulta:
SELECT * FROM `Contacts`
WHERE `Zona` = ''1''
AND `Responsable` = ''9''
AND (`AllowComercialVisit` = ''Call_Again'' OR `AllowComercialVisit` = ''Busy'' OR AllowComercialVisit` = ''Not_answered'')
AND `DateRecall` <= ''2016-06-20 13:04:52''
AND `DateRecall` >= ''2016-06-20 12:39:52''
ORDER BY `DateRecall` ASC
LIMIT 1
Simplemente rodee los OR con paréntesis.
Puede usar la instrucción IN()
lugar de OR
s:
SELECT * FROM `Contacts`
WHERE `Zona` = ''1''
AND `Responsable` = ''9''
AND `AllowComercialVisit` IN(''Call_Again'',''Busy'',''Not_answered'')
AND `DateRecall` <= ''2016-06-20 13:04:52''
AND `DateRecall` >= ''2016-06-20 12:39:52''
ORDER BY `DateRecall` ASC LIMIT 1
Un simple IN()
resolvería esto:
SELECT * FROM `Contacts`
WHERE `Zona` = ''1''
AND `Responsable` = ''9''
AND `AllowComercialVisit` IN (''Call_Again'',''Busy'',''Not_answered'')
AND `DateRecall` BETWEEN ''2016-06-20 12:39:52''
AND ''2016-06-20 13:04:52''
ORDER BY `DateRecall` ASC
LIMIT 1
En general, AND
tiene prioridad sobre OR
, cuando se usa OR
intenta usar paréntesis ->
WHERE COND1 AND COND2 AND (COND3 OR COND4) AND COND5
Lo que obligará al optimizador a seguir su prioridad y no al predeterminado.