Sql Postgres左连接和计数

Sql Postgres左连接和计数,sql,postgresql,join,count,left-join,Sql,Postgresql,Join,Count,Left Join,我在调试SQL查询时遇到了一些问题,非常感谢您的帮助 以下是查询: SELECT p.id, p.type, p.submission_id, p.title, p.description, p.date, extract('epoch' FROM p.time) AS time, podcasts.image_url, podcasts.title AS podcast_title, COUNT(u1) as upvote_count, u2.id as upvote_id,

我在调试SQL查询时遇到了一些问题,非常感谢您的帮助

以下是查询:

SELECT p.id, p.type, p.submission_id, 
  p.title, p.description, p.date, extract('epoch' FROM p.time) AS time, 
  podcasts.image_url, podcasts.title AS podcast_title, 
  COUNT(u1) as upvote_count, u2.id as upvote_id, 
  episodes.mp3_url, episodes.duration, 
  COUNT(c) as comment_count 
FROM posts AS p LEFT JOIN upvotes AS u1 ON p.id=u1.post_id AND u1.comment_id=-1 
LEFT JOIN upvotes AS u2 ON p.id=u2.post_id AND u2.user_id=$1 AND u2.comment_id=-1 
LEFT JOIN episodes ON p.submission_id = episodes.id 
LEFT JOIN podcasts ON episodes.podcast_id=podcasts.id 
LEFT JOIN comments AS c ON c.post_id=p.id 
WHERE p.type='podcast' AND p.time IS NOT NULL 
GROUP BY(p.id, u2.id, podcasts.image_url, episodes.mp3_url, episodes.duration, podcasts.title);
意外行为来自两个COUNT语句。我希望投票数等于

SELECT COUNT(*) FROM upvotes WHERE upvotes.post_id = (individual post id);
对于每个帖子和相同的评论计数(我希望返回每个帖子的评论总数。但是,我从这两个字段的查询中得到奇怪的看似随机的结果。有人能帮我诊断问题吗?

count()
(和所有其他聚合函数)忽略空值

但是,
COUNT(c)
引用表别名
c
中的完整行(“记录”),但即使该记录的所有列都为空,该行始终为非空


您需要更改
count()
调用并将该表中的一列传递给它,例如
count(u1.post\u id)
count(c.post\u id)

谢谢你的提示,我刚刚解决了这个问题。不过我仍然得到了同样奇怪的结果,我得到的计数实际上大于整个投票/评论中的行数table@user1023465:如果没有更多详细的示例数据,这很难说-但是联接可能会增加一对多或多对m中的行数任何关系。可能您希望使用
count(distinct u1.post_id)
来代替。调试此操作的最佳方法是在不使用group by的情况下运行查询,并查看返回的行。这将告诉您为什么会得到意外的数字。不相关,但是:在
group by
中的列周围加括号是无用的