Оператор моржа MySQL в локальной переменной?

#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 , и теперь все работает.