MySQL Query Fails - PullRequest
       3

MySQL Query Fails

0 голосов
/ 15 марта 2012

Я пытаюсь написать запрос, который вычисляет суммы строк и общее количество записей на основе текущей даты. Поле даты в моей базе данных в формате 14.03.2012 2:03:19. Запрос игнорирует дату и возвращает сумму всех записей в базе данных. Вот мой запрос:

$string = "
  SELECT SUM(totalcollected)
  FROM accounting
  WHERE agent = '$agentid'
    AND DATE(date) = DATE(NOW())
    AND amount1type = 'Cash'
     OR amount2type = 'Cash'
";

Есть предложения?

Ответы [ 4 ]

3 голосов
/ 15 марта 2012

Посмотрите на Диаграмма приоритета оператора MySQL .Вы заметите, что AND имеет более высокий приоритет по сравнению с OR, поэтому ваш запрос становится примерно таким:

SELECT SUM(totalcollected)
FROM accounting
WHERE
(
    agent = '$agentid' AND
    DATE(DATE) = DATE(NOW()) AND
    amount1type = 'Cash' 
)
OR
(
    amount2type = 'Cash'
)

Обратите внимание, что дата учитывается, когда (i) agent = $ agent (ii)) сумма1 тип = наличными;но строки, которые имеют sum2type = cash, всегда будут возвращаться независимо от даты.Вы должны добавить скобки, чтобы сообщить MySQL, как именно должен обрабатываться оператор where:

SELECT SUM(totalcollected)
FROM accounting
WHERE
agent = '$agentid' AND
DATE(DATE) = DATE(NOW()) AND
(
    amount1type = 'Cash' OR amount2type = 'Cash'
)
2 голосов
/ 15 марта 2012

Полагаю, в вашем предложении where пропущено несколько скобок ...

Последнее условие, or amount2type = 'cash' допускает ложное выполнение любого другого условия. Вы должны изменить это, чтобы сгруппировать с проверкой против amount1type:

SELECT SUM(amount1), SUM(amount2), SUM(monpay), SUM(totalcollected) 
FROM accounting 
WHERE
    agent = '$agentid' 
    AND DATE(date) = DATE(NOW()) 
    AND (amount1type = 'Cash' OR amount2type = 'Cash')
1 голос
/ 15 марта 2012

Проблема в AND разрешается до OR, но вы можете полностью избежать OR с помощью этого классного трюка:

SELECT SUM(totalcollected)
FROM accounting
WHERE agent = '$agentid'
AND DATE(date) = DATE(NOW())
AND 'Cash' IN (amount1type, amount2type)
0 голосов
/ 15 марта 2012

Вам нужна скобка, чтобы указать базе данных, что вы на самом деле пытаетесь сделать. Лучшее форматирование сделает это понятнее

SELECT SUM(totalcollected)
FROM accounting
WHERE agent = '$agentid'
    AND  DATE(date) = DATE(NOW())
    AND amount1type = 'Cash'
    OR amount2type = 'Cash'

против

SELECT SUM(totalcollected)
FROM accounting
WHERE agent = '$agentid'
    AND  DATE(date) = DATE(NOW())
    AND (amount1type = 'Cash' OR amount2type = 'Cash')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...