Mam następujące zapytanie:lub konfliktu między innymi warunkami
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
Problem polega na tym, że zapytanie powinno TYLKO pokazuje wiersze między pierwszym a drugim „DateRecall”, ale powrotu wszystkich wierszy z "Call_Again", "Busy" i "Not_answered" bez filtrowania daty.
Każde rozwiązanie zostanie docenione!
Nigdy, nigdy, * nigdy * wymieszaj 'OR' z' AND' bez użycia nawiasów, aby twoje grupowanie było jawne, w dowolnym języku. Nawet jeśli nie jest to ściśle wymagane w niektórych sytuacjach, nikt nie będzie w stanie określić twoich intencji bez nich. – jpmc26
Chociaż nie zgadzam się z tym, że "nikt nie będzie w stanie określić twoich intencji bez nich", absolutnie zgadzam się, aby zawsze używać nawiasów. Jedyny wyjątek, jaki robię, to kiedy dokonujesz dokładnie jednego porównania w językach, które go obsługują, takich jak Python; we wszystkich innych przypadkach nawiasy nie tylko sprawiają, że twój kod jest bardziej czytelny, ale chroni cię przed kolejnością operacji (i innymi, trudniejszymi do ilościowego określenia problemów, takimi jak pewne boolowskie dziwactwa w PHP, które nie mają logicznego sensu, ale nadal są odwrócone w ten sposób). W przypadku zapytań SQL należy również wziąć pod uwagę poziomy wcięć dla jasności zagnieżdżenia. – kungphu