Я конвертирую серию запросов из 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 месяцев, но я не могу проверить свою попытку преобразования.
Обновлено: РЕШЕНИЕ @Jeremy отметил, что мне не хватает закрывающей скобки в 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
@mjwills, к сожалению, ты прав! Мои извинения - простая опечатка на моем конце. Тем не менее проблема остается прежней. Я обновил свой исходный комментарий и заголовок, чтобы заменить MSSQL на MySQL. Обновлено: теперь, когда я указал правильный язык SQL, с которого я конвертирую; да, этот запрос работает по назначению (насколько я знаю SQL).
К вашему сведению, в соответствии с здесь схема базы данных идентична независимо от используемого языка SQL, поскольку она основана на этом xmldb-схема.
В этой строке отсутствует закрывающая скобка:
AND extract(epoch from NOW()) BETWEEN extract(epoch from NOW()- INTERVAL '12 months') AND to_date(NOW()::TEXT
Это также не имеет никакого смысла, но синтаксическая ошибка связана с отсутствием закрывающей скобки.
«Сейчас» всегда будет между «сейчас» и «двенадцатью месяцами назад». Преобразование now в текст и преобразование в дату в лучшем случае является дополнительным шагом, но после этого вы явно упускаете какую-то часть логики.
ох, хорошая подборка! В конце меня всегда достают скобки. Я также заметил, что использовал старую функцию to_date(), которая не поддерживается в этой конкретной версии Moodle, которую я заменил извлечением метода извлечения эпохи.