请参见下面的查询,其中我从没有函数的直接加法中获得了声誉值.
SELECT
"User"."id",
"User"."name",
"User"."title",
"User"."about",
"User"."location",
"User"."isModerator",
"User"."createdAt",
(
-- question vote
COALESCE(SUM("PostVote"."value" * 10) FILTER (WHERE "value" = 1 AND "Post"."questionId" IS NULL), 0)::int
+
COALESCE(SUM("PostVote"."value" * 2) FILTER (WHERE "value" = -1 AND "Post"."questionId" IS NULL), 0)::int
+
-- answer vote
COALESCE(SUM("PostVote"."value" * 10) FILTER (WHERE "value" = 1 AND "Post"."questionId" IS NOT NULL), 0)::int
+
COALESCE(SUM("PostVote"."value" * 2) FILTER (WHERE "value" = -1 AND "Post"."questionId" IS NOT NULL), 0)::int
+
-- accepted answer
(COALESCE(COUNT("answer"."id"), 0)::int * 15)
) as reputation
FROM "User"
LEFT JOIN "Post" ON "Post"."authorId" = "User"."id"
LEFT JOIN "PostVote" ON "PostVote"."postId" = "Post"."id"
LEFT JOIN "Post" as answer ON "Post"."acceptedAnswerId" = "answer"."id"
GROUP BY "User"."id"
ORDER BY reputation DESC, id
我这样做是因为SUM不能嵌套,我最初想做这样的事情.
-- ...
SUM(
-- question vote
COALESCE(SUM("PostVote"."value" * 10) FILTER (WHERE "value" = 1 AND "Post"."questionId" IS NULL), 0)::int
+
COALESCE(SUM("PostVote"."value" * 2) FILTER (WHERE "value" = -1 AND "Post"."questionId" IS NULL), 0)::int
+
-- answer vote
COALESCE(SUM("PostVote"."value" * 10) FILTER (WHERE "value" = 1 AND "Post"."questionId" IS NOT NULL), 0)::int
+
COALESCE(SUM("PostVote"."value" * 2) FILTER (WHERE "value" = -1 AND "Post"."questionId" IS NOT NULL), 0)::int
+
-- accepted answer
(COALESCE(COUNT("answer"."id"), 0)::int * 15)
) as reputation
-- ...
我很好奇是否有任何性能影响或总结可能导致不正确的值?我已经用负值进行了测试,它工作得很好,也许我遗漏了一些东西.
我本可以通过嵌套查询来使用SUM函数,但我认为这太冗长了.