Неизвестный столбец в предложении Where при использовании переменной, созданной с помощью AS - PullRequest
0 голосов
/ 14 февраля 2020

Речь идет об использовании столбца (который создается в запросе) в качестве критерия условия.

Существует две таблицы с именами транзакций и транзакций.

В транзакции есть уникальная информация для транзакции, такая как дата, контрагент и т. Д. c.

В транзакциях есть статьи, которые используются в транзакции. Таких как продукт, количество, цена и т. Д. c. И в транзакции транзакций есть столбец «транзакция», который ссылается на транзакции. Показывает, какой транзакции принадлежит движение.

В запросе я создал значение totalPrice с суммой количества * цена каждого движения, принадлежащего транзакции. .

Все работает отлично, но последний параметр предложения WHERE. Если я удаляю часть «AND totalPrice> 10», это дает мне все, включая totalPrice и totalQuantity транзакции. Но если я помещаю «AND totalPrice> 10» в конец, он возвращает следующую ошибку:

- # 1054 - Неизвестный столбец «totalPrice» в «предложении where»

SELECT 
`transactions`.id, 
`transactions`.type, 
`transactions`.date, 
`transactions`.VAT, 
`transactions`.currency, 
`companies`.name AS counterparty, 
COALESCE
(sum(`transactionmovements`.price*`transactionmovements`.quantity)
+(`transactions`.shippingQuantity*`transactions`.shippingPrice)) as totalPrice, 
COALESCE
(sum(`transactionmovements`.quantity)) as totalQuantity 
FROM 
`transactions` 
LEFT JOIN `companies` ON `transactions`.counterparty = `companies`.id 
LEFT JOIN `transactionmovements` ON `transactions`.id=`transactionmovements`.transaction 
WHERE ( `transactions`.type = 'p' OR `transactions`.type = 'r' OR `transactions`.type = 's' OR `transactions`.type = 't') 
AND 
(`transactions`.date BETWEEN IFNULL('','1900-01-01') AND IFNULL('2020-02-14',NOW())) 
AND 
totalPrice > 10 
GROUP BY `transactions`.id 
ORDER BY id desc 
LIMIT 10

Я пытался используя всю математическую операцию в предложении WHERE, но без выгоды. Я пытался использовать HAVING с WHERE, но не смог с этим справиться.

Последнее решение, которое у меня есть, это запустить его без фильтрации по totalPrice и сохранить в массиве php. Затем фильтр в массиве, но там я не могу использовать LIMIT, поэтому массив будет очень большим.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Как Томас Джерико предложил в комментариях, создание представления было именно тем, что мне нужно. Сначала я создаю виртуальную таблицу с помощью Create View.

CREATE VIEW transactionreportview
    AS SELECT 
        transactions.id id, 
        transactions.type type,
        transactions.date date,
        transactions.VAT VAT,
        transactions.currency currency,
        transactions.counterparty counterparty, 
        (SUM(transactionmovements.price*transactionmovements.quantity)+transactions.shippingQuantity*transactions.shippingPrice) totalPrice,
        SUM(transactionmovements.quantity) totalQuantity
    FROM transactions transactions, transactionmovements transactionmovements
    WHERE transactions.id = transactionmovements.transaction
    GROUP BY transactions.id;

Хотя виртуальная таблица действует как простая таблица mysql, я запустил новый запрос в таблице

SELECT * FROM transactionReportView WHERE ..."

Затем после окончания работы с виртуальным столом, бросьте его

DROP VIEW transactionreportview
0 голосов
/ 14 февраля 2020

В соответствии с тем, как SQL запрос выполняется в порядке , который диктует SELECT, выполняется после WHERE, вы не можете использовать ALIAS в WHERE, поскольку он неизвестен в данный момент. Поэтому вы должны изменить каждый псевдоним, используемый за пределами SELECT, на его определение.

...