【问题标题】:Postgres Query: Ranking posts by users based on user activityPostgres 查询:根据用户活动对用户的帖子进行排名
【发布时间】:2014-04-01 00:06:05
【问题描述】:

在最新版本的 PostgreSQL 中,给定以下为社交媒体参数应用程序创建的表,

CREATE TABLE Users (
  name varchar PRIMARY KEY,
  email varchar NOT NULL,
  password varchar NOT NULL
);

CREATE TABLE Topic (  
  id integer PRIMARY KEY,
  text varchar NOT NULL,  -- a controversial statement to be argued about
  creator varchar REFERENCES Users (name),
  postdate date NOT NULL
);

CREATE TABLE Argument (   
  id integer,
  topic integer REFERENCES Topic (id), -- statement argument is based on
  startdate date NOT NULL,             -- date argument started
  enddate date NOT NULL,               -- date argument ended
  PRIMARY KEY (id, topic)              -- weak entity, depends on statement
);

我正在尝试为给定用户编写一个函数或查询,将根据用户在该主题上发布的参数数量对他/她参与的主题进行排名,这样网站最终可以优先考虑用户的哪些参数将首先看到。我知道它涉及聚合,但我不确定如何正确连接这些关系。任何帮助将不胜感激!

【问题讨论】:

  • 我对此有点困惑。用户无论如何都没有连接到参数,所以你打算如何计算用户的参数?

标签: sql postgresql aggregate


【解决方案1】:
select name, topic.id as topic_id, count(*) as total_arguments
from
    argument a
    inner join
    topic t on t.id = a.topic
    inner join
    users u on u.name = t.creator
where name = _name
group by name, topic.id
order by total_arguments desc

【讨论】:

  • 稍作调整(在 select 和 group by 语句中将 topic.id 更改为 t.id),它似乎可以正常工作,谢谢!
【解决方案2】:

如果您为引用Users.nameArgument 添加author,您可以这样做:

SELECT Users.name, count(Argument.id) as arg_count, Topic.text
FROM Users
  INNER JOIN Argument ON Users.name = Argument.author
  INNER JOIN Topic ON Topic.id = Argument.topic
GROUP BY Users.name, Topic.text
ORDER BY arg_count DESC;

并添加WHERE Users.name = 'USERNAME' 以获取一个用户的列表。

您可以在http://sqlfiddle.com/#!15/d98ea/10查看它

【讨论】:

  • 我与@clodoaldo-neto 答案的不同之处在于,将作者添加到 Argument 您可以按参数数量而不是创建主题的数量进行过滤。不确定你指的是哪一个。
猜你喜欢
  • 1970-01-01
  • 2013-09-15
  • 2017-06-05
  • 2021-08-28
  • 2018-10-03
  • 2017-10-01
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多