Используйте результат подзапроса вне подзапроса

#mysql #mysql-5.7

Вопрос:

У меня есть таблица, структурированная так.

Идентификатор пользователя Тип подписки отметка времени
100 платеж 2/10/2021
99 пробный 2/10/2021
100 пробный 15/9/2021

Я хочу, чтобы мои выходные данные были такими же, с дополнительной колонкой, отображающей дату начала пробной версии, когда подписчик преобразуется в платную подписку.

Идентификатор пользователя Тип подписки отметка времени Trial_Start_date
100 платеж 2/10/2021 15/9/2021
99 пробный 2/10/2021
100 пробный 2/10/2021

На данный момент у меня есть такой запрос:

 SELECT *,
CASE WHEN    
            (SELECT `subscription_type` FROM subscription_event se1
            WHERE se1.`timestamp` < se.`timestamp` AND se1.user_id = se.user_id
            ORDER BY user_id DESC LIMIT 1) = 'TRIAL'
        then se1.`timestamp` else 0 end as "Converted_from_TRIAL"

FROM subscription_event se
 

У меня сообщение об ошибке с se1. timestamp не определено. Я понимаю, почему, но я не вижу обходного пути.

Какой-нибудь указатель?

Комментарии:

1. Почему это timestamp в последней строке результата 2/10/2021 ? Разве это не должно быть 15/9/2021 так, как в таблице ввода?

Ответ №1:

Если вам нужно получить два значения из подзапроса, вы должны присоединиться к нему, а не использовать его в качестве выражения.

 SELECT se.*,
    MAX(se1.timestamp) AS Converted_from_TRIAL
FROM subscription_event AS se
LEFT JOIN subscription_event AS se1 ON se.user_id = se1.user_id AND se1.timestamp < se.timestamp AND se1.subscription_type = 'TRIAL'
GROUP BY se.user_id, se.subscription_type, se.timestamp
 

Ответ №2:

Большое спасибо! По некоторым причинам мне нужно было явно объявить в SELECT переменные, используемые в ГРУППЕ BY . Не знаю, почему ( я использую MySQL5.7, так что, возможно, это связано с этим). В любом случае, это рабочий запрос.

 SELECT se.user_id, se.subscription_type, se.timestamp,
    MAX(se1.timestamp) AS Converted_from_TRIAL
    
FROM subscription_event AS se

LEFT JOIN subscription_event AS se1 ON se.user_id = se1.user_id AND se1.timestamp < se.timestamp AND se1.subscription_type = 'TRIAL'

GROUP BY se.user_id, se.subscription_type, se.timestamp