То, что я хочу получить, - user_discount.percent
внутри DiscountVar
.
Поэтому в THEN SET
я могу вернуть единую discount = DiscountVar
.
BEGIN
DECLARE DiscountVar FLOAT(28,10);
IF EXISTS
(
SELECT
user_discount.percent as DiscountVar,
user_discount.link_id,
user_discount.pacc_id,
user_discount.timestamp_valid
FROM
user_discount
WHERE
user_discount.link_id = wo_id
AND user_discount.pacc_id = pacc_id
AND UTC_TIMESTAMP>=user_discount.timestamp_valid
ORDER BY
user_discount.timestamp_valid DESC
LIMIT 1
)
THEN SET discount = DiscountVar;
ELSE SET discount = 0;
END IF;
END
Это возможно?
Я пробовал этот user_discount.percent AS percent INTO @DiscountVar
но он не работал...
IF EXISTS
на его собственные работы. Мне просто нужно сделать второй выбор только для вывода данных в THEN
.
Алиас в запросе не эквивалентен переменной процедуры. Если вы хотите назначить переменную, используйте SELECT... INTO
.
Вы также можете использовать назначение с помощью :=
. Но я думаю, что вы должны использовать пользовательскую переменную с префиксом @
, а не объявленную переменную.
Когда вы выполняете запрос с EXISTS
, он просто проверяет, соответствует ли запрос любым строкам, он не выполняет назначения. Вместо использования EXISTS
выполните SELECT
и проверьте, установлена ли переменная.
BEGIN
SELECT
@DiscountVar := user_discount.percent,
user_discount.link_id,
user_discount.pacc_id,
user_discount.timestamp_valid
FROM
user_discount
WHERE
user_discount.link_id = wo_id
AND user_discount.pacc_id = pacc_id
AND UTC_TIMESTAMP>=user_discount.timestamp_valid
ORDER BY
user_discount.timestamp_valid DESC
LIMIT 1;
SET discount = IFNULL(@DiscountVar, 0);
END
user_discount.link_id
,user_discount.pacc_id
иuser_discount.timestamp_valid
мы получим ошибку. Потому что они используются вWHERE
.SELECT
. Но как тогда мы приведемuser_discount.percent
вDiscountVar
?