yyyy español date_format mysql sql date select

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.