переменная AS (SELECT ...) SQL - PullRequest
       1

переменная AS (SELECT ...) SQL

0 голосов
/ 24 декабря 2018

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

У меня есть база данных, и я делаю несколько SQL-запросов,Этот работает нормально.

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 Month(datetime_buy)=1
    AND Year(datetime_buy)=2018 AND datetime_cancel IS NULL)
GROUP BY 1, 2;

Но когда я пытаюсь сохранить SELECT на будущее (например, jan_tickets):

jan_tickets AS (
SELECT DISTINCT email 
FROM ticket 
WHERE Month(datetime_buy)=1
AND Year(datetime_buy)=2018
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 jan_tickets
GROUP BY 1, 2;

Я получаюошибка:

Error SQL (1064): You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near 'jan_tickets AS (SELECT DISTINCT email FROM ticket
WHERE Month(datetime_buy)=1 AN' at line 1

Обновление: я использую MySQL 5.6.

1 Ответ

0 голосов
/ 24 декабря 2018

Предполагая, что вы работаете с 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...