背景:按關聯排序時設置默認值
我正在使用Rails和Postgres製作Hacker News的簡單副本。我已經完成了大部分工作,而且我正在努力讓訪問者通過它的分數對網站進行排序。就目前而言,我有,主要是工作。下面是相關的代碼:
Article.select("articles.*, SUM(CASE votes.is_up WHEN FALSE THEN -1 ELSE 1 END) AS score") .joins("LEFT JOIN votes ON articles.id = votes.votable_id AND votes.votable_type = 'Article'") .group("articles.id") .order("score DESC")
正如你或許可以告訴,這有一個問題:沒有得分的文章沒有適當的排序(至少有一個問題,反正 - 我不是一個SQL親以任何方式)。例如,如果我的文章分數爲2,-1,5和0,則訂單將爲0, 5, 2, -1
,而不是5, 2, 0, -1
的正確訂單。
問:
我認識到,要做到這一點最簡單的/最好的辦法可能是隻是把score
列上articles
- 並且我很可能也是走這條路線 - 但是這已經讓我很好奇:有沒有什麼辦法可以給出默認score
爲0到articles
而沒有關聯votes
?
更新1:
基礎上提出的建議,我已經改變了我的select語句:
Article.select("articles.*, COALESCE(SUM(CASE votes.is_up WHEN FALSE THEN -1 ELSE 1 END), 0) AS score")
然而,這並沒有改變結果的。
更新2:
運行我的查詢生成的SQL:
SELECT articles.*, COALESCE(SUM(CASE votes.is_up WHEN FALSE THEN -1 ELSE 1 END), 0) AS score FROM "articles" LEFT JOIN votes ON articles.id = votes.votable_id AND votes.votable_type = 'Article' GROUP BY articles.id ORDER BY score DESC LIMIT 20 OFFSET 0
您還可以看到LIMIT
和OFFSET
,我使用的分頁 - 我沒有提到這一點原本是因爲我預計它不相關。
做一個左外連接和'聚結((SUM(票),0)' – 2014-09-29 04:08:11
我從來沒有碰到過'coalesce'之前,非常感謝!從看Postgres的文檔,它肯定看起來像什麼我想要。 你在哪裏建議把左連接? – aandrea 2014-09-29 05:19:38