| From: | "Arjen van der Meijden" <acmmailing(at)vulcanus(dot)its(dot)tudelft(dot)nl> | 
|---|---|
| To: | "'Andrei Ivanov'" <andrei(dot)ivanov(at)ines(dot)ro>, <pgsql-general(at)postgresql(dot)org> | 
| Subject: | Re: left join is strange | 
| Date: | 2003-12-08 11:23:28 | 
| Message-ID: | 002701c3bd7d$b73e2210$3ac15e91@acm | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-general | 
> Andrei Ivanov wrote:
>
> I want to list all the products and the number of times each 
> product has 
> been viewed:
> 
> SELECT p.id, p.name, COALESCE(v.count, 0) AS views 
> FROM products p LEFT JOIN products_daily_compacted_views v ON 
> p.id = v.product 
> WHERE v.date = current_date OR v.date IS NULL ORDER BY views DESC
> 
> The problem with this query is that it doesn't return all the 
> products, 
> instead of 1785 rows, it returns 1077 rows
And that is exactly as it should be.
You will get the left joined combination of p and v, but the filter in
the where is applied afterwards on all those combinations.
> 
> This modified query seems to be correct, it returns all the 
> products...
> 
> SELECT p.id, p.name, COALESCE(v.count, 0) AS views 
> FROM products p LEFT JOIN products_daily_compacted_views v 
> ON p.id = v.product AND v.date = current_date 
> ORDER BY views DESC
> 
> Could anybody explain to me why does this happen ?
Here you apply your filter to the elements of v, before joining them to
the elements of p.
Best regards,
Arjen
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Oleg Bartunov | 2003-12-08 12:09:15 | Re: spelling errors in query terms | 
| Previous Message | Andrei Ivanov | 2003-12-08 10:58:57 | left join is strange |