Как вы используете VALUES () в операторе SELECT? - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь создать вывод в соответствии с:

days_since, item_count
7, 0
30, 1
90, 2

, и я хочу предоставить значения для days_since в виде списка, что-то вроде:

SELECT d.days, d.item_count
FROM (
    VALUES (7, 0), (30, 1), (90, 2)
) d (days, item_count)

за исключением item_count Мне нужно использовать days как часть запроса, который подсчитывает результаты для некоторого условия (is_a_thing), например:

SELECT COUNT(CASE WHEN is_a_thing THEN 1 END) AS item_count
FROM items
WHERE created >= CURRENT_DATE - 30

, но с датой для сравнения (30 здесь) должно быть days из списка.

К сожалению, я не уверен, как соединить VALUES с SELECT и иметь возможность использовать первое в последнем.

1 Ответ

2 голосов
/ 20 марта 2020

MySQL не поддерживает этот синтаксис (ie вы не можете создать производную таблицу с VALUES().

Самые последние версии имеют синтаксис VALUES(ROW ...):

SELECT d.days, d.item_count
FROM (VALUES ROW(7, 0), ROW(30, 1), ROW(90, 2)) d (days, item_count)

В более ранних версиях мы должны перезапустить UNION ALL:

SELECT d.days, d.item_count
FROM (
    SELECT 7 days, 0 item_count
    UNION ALL SELECT 30, 1
    UNION ALL SELECT 90, 2
) d

Я подозреваю, что вы хотите запрос:

SELECT d.days, SUM(CASE WHEN is_a_thing THEN 1 ELSE 0 END)item_count
FROM (VALUES ROW(7), ROW(30), ROW(90)) d (days)
LEFT JOIN items i
    ON i.created >= CURRENT_DATE - INTERVAL d.days
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...