Предполагая, что вы работаете с MySQL 8+, будет работать следующее обновление:
WITH jan_tickets AS (
SELECT DISTINCT email
FROM ticket
WHERE DATE_FORMAT(datetime_buy, '%Y-%m') = '2018-01' AND datetime_cancel IS NULL
)
SELECT
YEAR(datetime_buy),
MONTH(datetime_buy),
COUNT(DISTINCT email) AS number
FROM ticket
WHERE
YEAR(datetime_buy) = 2018 AND
email IN (SELECT email FROM jan_tickets)
GROUP BY 1, 2;
Здесь отмечается, что определение CTE должно начинаться с использования WITH
.Следующие CTE, следующие за , не , используют WITH
, но должны быть разделены запятой.После последнего определения CTE нет запятой до запроса, который его использует.В вашем случае вам нужен подзапрос в предложении WHERE
, который выбирает электронные письма из CTE.
Редактировать:
Поскольку вы используете только MySQL 5.6, выне может использовать общие табличные выражения.Итак, мы можем встроить подзапрос, содержащийся в CTE:
SELECT
YEAR(datetime_buy),
MONTH(datetime_buy),
COUNT(DISTINCT email) AS number
FROM ticket
WHERE
YEAR(datetime_buy) = 2018 AND
email IN (
SELECT DISTINCT email
FROM ticket
WHERE DATE_FORMAT(datetime_buy, '%Y-%m') = '2018-01' AND
datetime_cancel IS NULL
)
GROUP BY 1, 2;