GROUP BY应该放在哪里?
Where should the GROUP BY be placed?
我在浏览代码库时遇到了一些原始的 SQL,如下所示
SELECT count(1) AS "n", "forms_newspaperperson"."sex", "forms_newspapersheet"."topic"
FROM "forms_newspaperperson"
INNER JOIN "forms_newspapersheet" ON ("forms_newspaperperson"."newspaper_sheet_id" = "forms_newspapersheet"."id")
, "reports_weights"
WHERE ("forms_newspaperperson"."deleted" = %s
AND "forms_newspapersheet"."country" IN (%s)
AND "forms_newspaperperson"."sex" IN (%s, %s)
AND (reports_weights.country = forms_newspapersheet.country)
AND (reports_weights.media_type = 'Print'))`
这会引发以下错误
django.db.utils.ProgrammingError: column "forms_newspaperperson.sex" must appear in the GROUP BY clause or be used in an aggregate function
web_1 | LINE 1: SELECT count(1) AS "n", "forms_newspaperperson"."sex", "form...
关于我应该把 GROUP BY
放在哪里有什么建议吗?
您有一个聚合查询。所以你需要一个 group by
:
SELECT count(1) AS "n", npp."sex", nps."topic"
FROM "forms_newspaperperson" npp INNER JOIN
"forms_newspapersheet" nps
ON npp."newspaper_sheet_id" = nps."id" CROSS JOIN
"reports_weights" w
ON w.country = npp.country
WHERE npp."deleted" = %s AND nps."country" IN (%s) AND
npp."sex" IN (%s, %s) AND w.media_type = 'Print'
GROUP BY npp."sex", nps."topic";
另请注意,我修复了 FROM
子句以删除逗号 - 这是过时的 - 并将其替换为适当、明确、标准、可读 JOIN
语法。
我在浏览代码库时遇到了一些原始的 SQL,如下所示
SELECT count(1) AS "n", "forms_newspaperperson"."sex", "forms_newspapersheet"."topic"
FROM "forms_newspaperperson"
INNER JOIN "forms_newspapersheet" ON ("forms_newspaperperson"."newspaper_sheet_id" = "forms_newspapersheet"."id")
, "reports_weights"
WHERE ("forms_newspaperperson"."deleted" = %s
AND "forms_newspapersheet"."country" IN (%s)
AND "forms_newspaperperson"."sex" IN (%s, %s)
AND (reports_weights.country = forms_newspapersheet.country)
AND (reports_weights.media_type = 'Print'))`
这会引发以下错误
django.db.utils.ProgrammingError: column "forms_newspaperperson.sex" must appear in the GROUP BY clause or be used in an aggregate function
web_1 | LINE 1: SELECT count(1) AS "n", "forms_newspaperperson"."sex", "form...
关于我应该把 GROUP BY
放在哪里有什么建议吗?
您有一个聚合查询。所以你需要一个 group by
:
SELECT count(1) AS "n", npp."sex", nps."topic"
FROM "forms_newspaperperson" npp INNER JOIN
"forms_newspapersheet" nps
ON npp."newspaper_sheet_id" = nps."id" CROSS JOIN
"reports_weights" w
ON w.country = npp.country
WHERE npp."deleted" = %s AND nps."country" IN (%s) AND
npp."sex" IN (%s, %s) AND w.media_type = 'Print'
GROUP BY npp."sex", nps."topic";
另请注意,我修复了 FROM
子句以删除逗号 - 这是过时的 - 并将其替换为适当、明确、标准、可读 JOIN
语法。