通过计算关联数来将2个表与where子句和顺序连接起来

时间:2017-03-11 21:17:53

标签: sql postgresql

我有2个PostgreSQL表,文章和投票。每篇文章都可以随时进行多次投票。因此表格如下:

文章:

ID, Title, Content
1, Title, Content
2, Title, Content
3, Title, Content

投票:

ID, ArticleID, UserID, Created_at
1, 1, userA, 1489266747
2, 1, userB, 1489266757
3, 2, userC, 1489266767

现在我想:

  1. 选择所有文章,
  2. 按最新(24小时内)票数
  3. 订购所有文章

    有任何建议怎么做?我想我需要使用左连接,但仍然无法选择最新的选票。

3 个答案:

答案 0 :(得分:1)

你走了:

SELECT ID, Title, Content,
       (SELECT count(*) FROM Votes WHERE ArticleID = Article.OD AND Created_at >= UNIX_TIMESTAMP() - 86400) as votes_24h
FROM Article
ORDER BY votes_24h DESC;

答案 1 :(得分:1)

嗯。嗯。 。 。您可以使用子查询将订购标准直接放在ORDER BY中:

select a.*
from articles a
order by (select count(*)
          from votes v
          where v.ArticleId = a.id and
                v.CreatedAt >= extract(epoch from now()) - 24*60*60
         ) desc;

就个人而言,我希望看到SELECT中的投票数,但你明确没有要求提供这些信息。

答案 2 :(得分:0)

您可以使用LEFT JOIN,按文章分组并按COUNT()订购:

select a.ID, a.Title, a.Content
from Article a
left join Votes v
    on  v.ArticleID = a.ID
    and v.Created_at >= extract(epoch from now()) - 24*60*60
group by a.ID, a.Title, a.Content
order by count(v.ArticleID) desc, a.ID

请注意,24h条件需要在ON子句中才能显示过去24小时内没有投票的文章。

您还可以将计数添加到SELECT子句并按别名排序:

select a.ID, a.Title, a.Content, count(v.ArticleID) as voteCount
from Article a
left join Votes v
    on  v.ArticleID = a.ID
    and v.Created_at >= extract(epoch from now()) - 24*60*60
group by a.ID, a.Title, a.Content
order by voteCount desc, a.ID;

演示:http://rextester.com/LGXXCS89847