【问题标题】:Difference of 2 columns of query2列查询的差异
【发布时间】:2014-04-06 22:52:47
【问题描述】:

我有一个VoteQuestion 表:VoteQuestion(idUser → User, idQuestion → Content, isUp)

还有一个Question 表:Question(idQuestion → Content, title)

我想选择得分最高的 5 个问题(赞成-反对)。
赞成票是VoteQuestionisUp = TRUE,反对票是VoteQuestionisUp = FALSE

我尝试了以下查询,但这不是我想要的。它对每个问题给出相同的分数。

WITH upvotes AS
( 
  SELECT COUNT(*) AS "a"
  FROM "VoteQuestion", "Question"
  WHERE "VoteQuestion"."idQuestion" = "Question"."idQuestion"
  AND "VoteQuestion"."isUp" IS TRUE
), 
downvotes AS
( 
  SELECT COUNT(*) AS "b"
  FROM "VoteQuestion", "Question"
  WHERE "VoteQuestion"."idQuestion" = "Question"."idQuestion"
  AND "VoteQuestion"."isUp" IS FALSE
)
SELECT "title", "Question"."idQuestion", upvotes."a"-downvotes."b" AS total
FROM "VoteQuestion", "Question", upvotes, downvotes
WHERE "VoteQuestion"."idQuestion" = "Question"."idQuestion"
GROUP BY "title", "Question"."idQuestion", upvotes."a", downvotes."b"
ORDER BY "total" DESC
LIMIT 5

也试过这个:

SELECT "title", "Question"."idQuestion", 
( SELECT COUNT(*) 
  FROM "VoteQuestion", "Question"
  WHERE "VoteQuestion"."idQuestion" = "Question"."idQuestion"
  AND "VoteQuestion"."isUp" IS TRUE
) AS upvotes, 
( SELECT COUNT(*) 
  FROM "VoteQuestion", "Question"
  WHERE "VoteQuestion"."idQuestion" = "Question"."idQuestion"
  AND "VoteQuestion"."isUp" IS FALSE
) AS downvotes, upvotes-downvotes AS total
FROM "VoteQuestion", "Question"
WHERE "VoteQuestion"."idQuestion" = "Question"."idQuestion"
GROUP BY "title", "Question"."idQuestion"
ORDER BY total DESC
LIMIT 5

但上面写着ERROR: column "upvotes" does not exist

如何从查询中获取某一列中赞成票和反对票的区别?

【问题讨论】:

    标签: sql postgresql select difference


    【解决方案1】:

    使用内联条件语句将您的 TrueFalse 值转换为数字(分别为 1 和 -1),您可以像这样简单地总结投票:

    SELECT
        q."title",
        q."idQuestion",
        sum(
           case
               when v."isUp" then 1
               else -1
           end
        ) AS total
    
    FROM
        VoteQuestion v join Question q on v."idQuestion" = q."idQuestion"
    
    GROUP BY
        q."title",
        q."idQuestion"
    
    ORDER BY
        3 DESC
    
    LIMIT 5
    

    我还没有尝试过,但我很确定这可行。

    编辑: 这是成功运行的 SQLFiddle:http://sqlfiddle.com/#!15/df4ca/3

    【讨论】:

    • 是的,试过了,效果很好。顺便说一句,你有一个错字 - ORDER BY total DESC。感谢您的回答,谢谢!
    • ORDER BY 3 DESC 指的是列总数,因为它是投影中的第三列。
    • CaMeL-case 名称 ("VoteQuestion") 可能需要在表名称周围加上双引号。
    【解决方案2】:

    试试这个:

    SELECT "title", "Question"."idQuestion", 
    ( SELECT COUNT(*) as upvotes
      FROM "VoteQuestion", "Question"
      WHERE "VoteQuestion"."idQuestion" = "Question"."idQuestion"
      AND "VoteQuestion"."isUp" IS TRUE
    ) AS upvt, 
    ( SELECT COUNT(*) as downvotes
      FROM "VoteQuestion", "Question"
      WHERE "VoteQuestion"."idQuestion" = "Question"."idQuestion"
      AND "VoteQuestion"."isUp" IS FALSE
    ) AS downvt, upvt.upvotes-downvt.downvotes AS total
    FROM "VoteQuestion", "Question"
    WHERE "VoteQuestion"."idQuestion" = "Question"."idQuestion"
    GROUP BY "title", "Question"."idQuestion"
    ORDER BY total DESC
    LIMIT 5
    

    希望对你有帮助

    更新

    让我们试试这个:

    SELECT "title", "Question"."idQuestion", 
    upvotes, downvotes, upvotes-downvotes AS total
    FROM "VoteQuestion", "Question",
    ( SELECT "idQuestion", COUNT(*) as upvotes
      FROM "VoteQuestion", "Question"
      WHERE "VoteQuestion"."idQuestion" = "Question"."idQuestion"
      AND "VoteQuestion"."isUp" IS TRUE GROUP BY "idQuestion"
    ) AS upvt, 
    ( SELECT "idQuestion", COUNT(*) as downvotes
      FROM "VoteQuestion", "Question"
      WHERE "VoteQuestion"."idQuestion" = "Question"."idQuestion"
      AND "VoteQuestion"."isUp" IS FALSE GROUP BY "idQuestion"
    ) AS downvt
    WHERE "VoteQuestion"."idQuestion" = "Question"."idQuestion"
    AND "VoteQuestion"."idQuestion" = downvt."idQuestion"
    AND "VoteQuestion"."idQuestion" = upvt."idQuestion"
    GROUP BY "title", "Question"."idQuestion"
    ORDER BY total DESC
    LIMIT 5
    

    【讨论】:

    • 感谢您的回答。在来这里之前,我已经尝试过类似的事情。事实上,它说missing FROM-clause entry for table upvt。然后我在FROM-子句中添加upvt,它说relation "upvt" does not exist。你知道可能出了什么问题吗?
    • 分别测试每个部分。首先这样做: SELECT COUNT(*) as upvotes FROM "VoteQuestion", "Question" WHERE "VoteQuestion"."idQuestion" = "Question"."idQuestion" AND "VoteQuestion"."isUp" IS TRUE 它给你点赞?
    • 那里缺少一个条件 - AND "VoteQuestion"."idQuestion" = "Question"."idQuestion"。除此之外,是的,它给了我支持。
    • GROUP BY 行有一些错误,不知道为什么。但是,另一个答案使这更紧凑,更易于阅读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 2020-03-08
    • 2016-02-02
    • 2022-10-13
    • 1970-01-01
    • 2015-04-28
    • 2011-09-17
    相关资源
    最近更新 更多