The same problem occurs with PostreSQL as well: nulls (if present) are
always returned with zero count in aggregates.

Since my post did not stir much of a commotion I conclude that there
are no strong opinions among django developers as to which form of
count should be used in aggregates. So I'll go ahead and will file a
bug in track.

Cheers

On Wed, Jan 26, 2011 at 10:03 AM, Sergiy Kuzmenko <s.kuzme...@gmail.com> wrote:
> I want to be able to count how many times each value (including nulls)
> is present. I think that exactly what count is for. -:)
>
> Upon a closer look the problem is not limited to foreign keys. When
> django generates count clauses in `count(<name>)` form here's what
> happens (in MySQL at least):
>
> SELECT foo, count(foo) FROM test group by foo;
> +-------+------------+
> | foo   | count(foo) |
> +-------+------------+
> | NULL  |          0 |
> | one   |          1 |
> | three |          3 |
> | two   |          2 |
> +-------+------------+
>
> This is what MySQL outputs. Django simply takes these rows and outputs
> them in a list of dictionaries to the user. The problem here is not
> that nulls are not counted but that nulls are included in the output.
> Looking at these results one may conclude that there are no null
> values, right? Well actually wrong. Using `count(*)` form produces
> quite different results:
>
> SELECT foo, count(*) FROM test group by foo;
> +-------+----------+
> | foo   | count(*) |
> +-------+----------+
> | NULL  |        1 |
> | one   |        1 |
> | three |        3 |
> | two   |        2 |
> +-------+----------+
>
> Now we see the whole picture and the sum of all individual counts is
> equal to MyModel.objects.count()
>
> This inclines to believe (lack of experience with other back ends
> prevents me from asserting this) that current behaviour is a bug and
> that django should generate `count(*)` clauses instead of
> `count(<name>)`.
>
>
> On Wed, Jan 26, 2011 at 9:28 AM, Stephen Burrows
> <stephen.r.burr...@gmail.com> wrote:
>> Perhaps I'm missing something, but if you count all the defined
>> foreign keys AND all the null values, won't you just end up with a
>> count of the parent model? Or are you saying that you explicitly want
>> to count how many values are null *instead of* defined?
>>
>> On Jan 25, 2:39 pm, Sergiy Kuzmenko <s.kuzme...@gmail.com> wrote:
>>> Hi there!
>>>
>>> Annotating a nullable foreign field with Count seems to always return
>>> the count of null values as zero (at least in MySQL environment). A
>>> quick look into this problem reveals that the corresponding SQL clause
>>> is generated as `count(<field_name>)` [1]. This causes to exclude null
>>> values from annotation in MySQL [2]. I believe the same applies to
>>> PostgreSQL [3] and likely to other backends.
>>>
>>> In my mind, current behaviour is bit of a bug (it is definitely quirky
>>> in MySQL). But it is possible that not counting null values was
>>> intentional. In this case there should be at least a way for user to
>>> specify that null values must also be counted. Perhaps something like:
>>>
>>> Count(field_name, count_nulls=True)
>>>
>>> [1]http://code.djangoproject.com/browser/django/trunk/django/db/models/s...
>>> [2]http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#functi...
>>> [3]http://www.postgresql.org/docs/9.0/static/sql-expressions.html
>>>
>>> Thanks
>>> Sergiy
>>
>> --
>> You received this message because you are subscribed to the Google Groups 
>> "Django developers" group.
>> To post to this group, send email to django-developers@googlegroups.com.
>> To unsubscribe from this group, send email to 
>> django-developers+unsubscr...@googlegroups.com.
>> For more options, visit this group at 
>> http://groups.google.com/group/django-developers?hl=en.
>>
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-developers@googlegroups.com.
To unsubscribe from this group, send email to 
django-developers+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en.

Reply via email to