#mysql #sql #sum #subquery #window-functions
#mysql #sql #сумма #подзапрос #окно-функции
Вопрос:
Итак, у меня есть процедура, которая выглядит следующим образом
CREATE PROCEDURE slct()
BEGIN
DECLARE ttl INT DEFAULT 0;
SELECT NULL AS price, NULL AS account_id, NULL as max_amount, NULL as total
FROM sellers
UNION ALL
SELECT price, account_id, max_amount, ttl := ttl max_amount
FROM (SELECT * FROM sellers ORDER BY price ASC) C where selling_currency_id = :buying and buying_currency_id = :buying_with and ttl < :quantity
END
Это выдает мне синтаксическую ошибку из-за оператора моржа здесь: ttl := ttl max_amount
. Если бы это была пользовательская переменная ( @ttl
), этот оператор моржа работал бы, но тот факт, что @ttl не ограничен, внес бы несколько ошибок в мои запросы.
Итак, мне было интересно: как бы мне заставить это :=
работать / заменить его чем-то эквивалентным?
Редактировать :
Я узнал о ключевом слове INTO, и теперь мой запрос выглядит следующим образом. Все еще говорит, что у меня синтаксическая ошибка…
CREATE PROCEDURE select_buy(
IN buying BIGINT UNSIGNED,
IN buying_with BIGINT UNSIGNED,
IN quantity BIGINT UNSIGNED,
INOUT ttl BIGINT UNSIGNED
)
BEGIN
SELECT NULL AS price, NULL AS account_id, NULL as max_amount, NULL as total
FROM sellers
UNION ALL
SELECT price, account_id, max_amount, (SELECT (ttl max_amount) INTO ttl) AS total
FROM (SELECT * FROM sellers ORDER BY price ASC) C where selling_currency_id = buying and buying_currency_id = buying_with and ttl < quantity
END
Комментарии:
1. В качестве назначения оператора назначения могут использоваться только пользовательские переменные, а не локальные переменные. тот факт, что @ttl не ограничен, внесет несколько ошибок в мои запросы. ?? Как это может быть? предоставьте, пожалуйста, скрипку для моделирования.
2. Что такое
:buying
,:buying_with
и:quantity
? Они выглядят как заполнители PDO, но я не думаю, что вы можете использовать их в процедуре.3. Я полагаю, из-за совпадения? Я не думаю, что есть какая-либо блокировка для @total? или я совершенно не прав? (да, это заполнители)
4. Это переменные сеанса, и каждое соединение имеет свои собственные переменные.
5. Вам не нужно беспокоиться о том, что вы
@total
вмешиваетесь в работу кого-то другого.
Ответ №1:
Мой код не работал с @total, потому что я не сбрасывал @total (хотя это выглядит так). Я добавил SET @total = 0
, и теперь все работает.