2017-01-09 150 views
0

我在調試SQL查詢時遇到了一些麻煩,並且非常感謝您的幫助。Postgres LEFT JOIN和COUNT

下面是該查詢:

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語句。我希望upvote_count等同於

SELECT COUNT(*) FROM upvotes WHERE upvotes.post_id = (individual post id); 

爲每個單獨的職位和相同的評論數(我希望返回的意見總數的每個職位。不過,我從這些查詢獲得奇怪看似隨機的結果對於這兩個領域。誰能幫我診斷問題?

+0

不相關,但是:在group by的列中放置括號是沒用的 –

回答

1

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

然而,從表COUNT(c)引用完整行(「記錄」)別號c但即使該記錄的所有列都爲空,始終是非空

您需要更改兩個count()調用並將從該表格傳遞給它,例如, count(u1.post_id)count(c.post_id)

+0

感謝提示,我只是修復了這個問題。我仍然得到相同的奇怪結果,但我得到的數量實際上大於整個upvotes/comments表中的行數 – user1023465

+1

@ user1023465:沒有更多詳細信息示例數據很難說 - 但是一個連接可能會增加一對多或多對多關係中的行數。也許你想'count(distinct u1.post_id)'而不是。調試這個最好的方法是運行查詢**,而不需要** group並查看返回的行。這會告訴你爲什麼你會得到意想不到的數字。 –