Как исправить синтаксические ошибки в предложении GROUP BY при преобразовании MySQL в PostgreSQL

Я конвертирую серию запросов из 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
moodleschema.zoola.io/index.html говорит MySQL? Вы используете MS SQL или MySQL?
mjwills 24.06.2019 02:36

@mjwills, к сожалению, ты прав! Мои извинения - простая опечатка на моем конце. Тем не менее проблема остается прежней. Я обновил свой исходный комментарий и заголовок, чтобы заменить MSSQL на MySQL. Обновлено: теперь, когда я указал правильный язык SQL, с которого я конвертирую; да, этот запрос работает по назначению (насколько я знаю SQL).

Zectzozda 24.06.2019 03:17

К вашему сведению, в соответствии с здесь схема базы данных идентична независимо от используемого языка SQL, поскольку она основана на этом xmldb-схема.

Zectzozda 25.06.2019 02:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
270
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

ох, хорошая подборка! В конце меня всегда достают скобки. Я также заметил, что использовал старую функцию to_date(), которая не поддерживается в этой конкретной версии Moodle, которую я заменил извлечением метода извлечения эпохи.

Zectzozda 24.06.2019 03:38

Другие вопросы по теме

Преобразование списка в формате дня, ЧМС в час в формате postgresql
Как загрузить изображения в приложение для Android из весеннего загрузочного приложения?
Как написать SQL-запрос с минимальной и максимальной зарплатой в каждом отделе по дате?
Копировать данные из одной таблицы в другую — игнорировать дубликаты Postgresql
Обрабатывать значения NULL в триггере представлений PostgreSQL, используя DEFAULT?
Ошибка резервного копирования базы данных Postgres - специальный символ в пароле
Есть ли способ в PostgreSQL найти все представления, использующие сторонние оболочки данных?
Какое максимальное количество скаляров можно использовать в предложении IN?
Почему мой контроллер продолжает ожидать получения данных, хотя я очистил базу данных
Как я могу увидеть правильный номер того или иного статуса, если статус время от времени меняется (исторические данные)