Как исправить синтаксические ошибки в предложении GROUP BY при преобразовании MySQL в PostgreSQL - PullRequest
0 голосов
/ 24 июня 2019

Я конвертирую серию запросов из MySQL в PostgreSQL для запуска на конкретном экземпляре Moodle.Я ни в коем случае не являюсь экспертом ни в одном языке, поэтому мне сложно понять, почему PostgreSQL вызывает синтаксическую ошибку в моем предложении GROUP BY.Как правильно создать предложение GROUP BY?

Я смотрел другие ответы на StackOverflow, в которых упоминается, что предложение GROUP BY требует перечисления всех столбцов в операторе SELECT.Я добавил другие столбцы в предложение GROUP BY (см. Закомментированный код ниже).Тем не менее, остается та же проблема.

Это запускается в инструменте отчетов SQL в приложении Moodle (структура базы данных здесь: https://moodleschema.zoola.io/index.html).

-- valid MySQL query. This query selects the course name, counts the times the course has been accessed within the last 12 months and displays it in a table IF it is a visible course.
SELECT c.fullname, count(course) AS actions, course AS courseid, c.visible AS visibility
FROM prefix_log l, prefix_course c
WHERE l.course = c.id
  AND c.visible = 1
  AND time BETWEEN unix_timestamp(date_sub(Now(), INTERVAL 12 MONTH)) AND unix_timestamp(Now())
  AND c.id != 1
GROUP BY course
ORDER BY actions DESC
--postgreSQL conversion attempt
SELECT c.fullname, count(course) AS actions, course AS courseid, c.visible AS visibility
FROM prefix_log l, prefix_course c
WHERE l.course = c.id
  AND c.visible = 1
  AND extract(epoch from NOW()) BETWEEN extract(epoch from NOW()- INTERVAL '12 months') AND to_date(NOW()::TEXT
  AND c.id != 1
GROUP BY course
-- Query failed
--
-- ERROR:  syntax error at or near "GROUP"
-- LINE 7: GROUP BY course
--         ^
-- When using the 'GROUP BY course, actions, c.fullname, c.visible' clause:
-- Query failed
--
-- ERROR:  syntax error at or near "GROUP"
-- LINE 8: GROUP BY course, actions, c.fullname, c.visible
--         ^
ORDER BY actions DESC

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

РЕДАКТИРОВАТЬ: РЕШЕНИЕ @ Джереми отметил, что в пропущенной закрывающей скобке я пропустил12-месячное предложение в выражении WHERE. Я также исправил некоторые незначительные ошибки в моем коде - см. Ниже.

SELECT c.fullname as CourseName, COUNT(course) AS actions, course AS courseid, c.visible AS visibility
FROM prefix_log l, prefix_course c
WHERE l.course = c.id
  AND c.visible = 1
  AND extract(epoch from NOW()) BETWEEN extract(epoch from NOW()- INTERVAL '12 months') AND extract(epoch from NOW())
  AND c.id != 1
GROUP BY course, c.fullname, c.visible
ORDER BY actions DESC

1 Ответ

0 голосов
/ 24 июня 2019

В этой строке отсутствует закрывающая скобка:

AND extract(epoch from NOW()) BETWEEN extract(epoch from NOW()- INTERVAL '12 months') AND to_date(NOW()::TEXT

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

Теперь будет всегдабыть между сейчас и двенадцать месяцев назад.Преобразование в текст и преобразование в дату в лучшем случае является дополнительным шагом, но после этого вы явно упускаете часть логики.

...