【问题标题】:SQL Query for sorting by number of identical values in column用于按列中相同值的数量排序的 SQL 查询
【发布时间】:2015-02-26 14:51:50
【问题描述】:

我正在尝试为 Postgresql 编写一个 sql 查询,该查询通过一个主题的描述表和另一个表来记录有多少喜欢或不喜欢或其他标志附加到描述中。我希望它通过计数表,找到每个描述附加的所有标志,找到每个描述有多少相同标志的总和,然后按每个标志的喜欢数减去它有多少不喜欢等,然后返回所有描述的列表,该列表按前面描述的方程(喜欢 - 不喜欢等)和喜欢、不喜欢等的数量排序。这是我到目前为止的代码示例(有更多变量在喜欢/不喜欢作为变量部分):

        SELECT likes, dislikes, positive - negative AS orderCondition
        FROM( SELECT d.id, d.l_id, d.user_id, d.description, a.flaggee_id,
        SUM( CASE WHEN a.actions_id = 1 THEN 1 WHEN actions_id = 6 THEN 1 ELSE 0 END ) AS positive,
        SUM( CASE WHEN a.actions_id <> 1 THEN 1 WHEN a.actions_id <> 6 THEN 1 ELSE 0 END ) AS negative,
        SUM( CASE WHEN a.actions_id = 1 THEN 1 ELSE 0 END ) AS likes,
        SUM( CASE WHEN a.actions_id = 2 THEN 1 ELSE 0 END ) AS dislikes
        FROM descriptions d, description_actions a
        WHERE d.id = a.flaggee_id OR d.id > 0 AND d.id <> a.flaggee_id
        GROUP BY d.id, a.flaggee_id ) as result
        ORDER BY orderCondition DESC;

这不起作用但是,它返回一个空集而没有错误。表中的数据是随机的用于测试,id 是整数,不是 id 的东西是随机字符串,当单独查询表时结果是准确的,所以它不是数据不在表中的情况。我很难弄清楚。任何帮助将不胜感激。

【问题讨论】:

  • 描述问题所在 - 是数据库错误吗?出乎意料的结果?
  • 不工作”不是有效的 Postgres 错误消息。请添加一些示例数据和基于该示例数据的预期输出。
  • 抱歉,我认为对于更有经验的人来说,通过查看代码可能会很明显。查询返回空集
  • 将此添加到描述中,如果它不充分,现在让我...“它返回一个没有错误的空集。表中的数据是随机的用于测试,id 是整数,不是的东西id 是随机字符串,当单独查询表时结果是准确的,所以它不是数据不在表中的情况。”
  • 您能否验证您的样本数据中至少有一行d.id = a.flaggee_id OR d.id &gt; 0 AND d.id &lt;&gt; a.flaggee_id 为真?我建议加上括号 (d.id = a.flaggee_id OR (d.id &gt; 0 AND d.id &lt;&gt; a.flaggee_id)) 以提高可读性。此外,如果您希望描述显示在结果中,则必须将其添加到外部 SELECT 语句中。

标签: sql postgresql join sum


【解决方案1】:

我想通了,我需要指定它是一个左连接,以便在标志表为空时仍然显示结果,我还在外部选择中添加了变量。这是工作查询

SELECT description, likes, dislikes, positive - negative AS orderCondition
FROM( SELECT d.id, d.l_id, d.user_id, d.description AS description, a.flaggee_id,
SUM( CASE WHEN a.actions_id = 1 THEN 1 WHEN actions_id = 6 THEN 1 ELSE 0 END ) AS positive,
SUM( CASE WHEN a.actions_id <> 1 THEN 1 WHEN a.actions_id <> 6 THEN 1 ELSE 0 END ) AS negative,
SUM( CASE WHEN a.actions_id = 1 THEN 1 ELSE 0 END ) AS likes,
SUM( CASE WHEN a.actions_id = 2 THEN 1 ELSE 0 END ) AS dislikes
FROM descriptions d LEFT JOIN description_actions a ON a.flaggee_id = d.id
GROUP BY d.id, a.flaggee_id ) as result
ORDER BY orderCondition DESC;

【讨论】:

    猜你喜欢
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2017-06-02
    • 2018-10-07
    • 2018-08-21
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多