将 MySQL 转换为 PostgreSQL 时如何修复 GROUP BY 子句的语法错误

How to fix syntax errors on GROUP BY clause when converting MySQL to PostgreSQL

我正在将特定 Moodle 实例上的一系列查询从 MySQL 转换为 PostgreSQL 再到 运行。我无论如何都不是这两种语言的专家,这让我很困惑为什么 PostgreSQL 在我的 GROUP BY 子句上抛出语法错误。如何正确创建 GROUP BY 子句?

我查看了 Whosebug 上的其他答案,其中提到 GROUP BY 子句需要列出 SELECT 语句中的所有列。我已将其他列添加到 GROUP BY 子句中(请参阅下面注释掉的代码)。但是,同样的问题仍然存在。

这是 Moodle 应用程序 SQL 报告工具中的 运行(此处的数据库结构: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 的转换尝试是有效的并且 returns 是过去 12 个月内有效课程的列表,但我无法验证我的转换尝试.

编辑:解决方案 @Jeremy 注意到我在 WHERE 语句的 12 个月子句中遗漏了一个右括号。我还在我的代码中修复了一些由此产生的小错误 - 见下文。

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

此行缺少右括号:

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

它也没有任何意义,但是语法错误是由于缺少右括号造成的。

现在总是从现在到十二个月前。现在转换为文本并转换为日期充其量只是一个额外的步骤,但您显然缺少了之后的某些逻辑部分。