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: | Raw Message | Whole Thread | 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 |