by “past month” do you mean march 2010, or do you mean the previous 30 days from today?
yes, it will be a LEFT OUTER JOIN, although i’m guessing that an article that has not been read at all will not be of interest, so you can probably get away with an INNER JOIN
SELECT articles.id
, articles.title
, COUNT(*) AS visits
FROM articles
INNER
JOIN visits
ON visits.article_id = articles.id
AND visits.visit_date > CURRENT_DATE - INTERVAL '30' DAY
GROUP
BY articles.id
ORDER
BY visits DESC