> -----Original Message-----
> From: Dan Nelson [mailto:[EMAIL PROTECTED]
> Sent: 18 June 2007 15:11

<snip>

> > > > At the moment, I have this and it works:
> > > >
> > > >         select * from contact_address
> > > >         group by primary_entity_id
> > > >         having count(primary_entity_id) = 1
> > > >         and is_primary = 0;
> > > >
> > > > This is fine except I want to use the result in a sub-query.
> > > > Since it returns two columns this doesn't work:
> > > >
> > > >         update contact_address set is_primary = 1 where
> address_id in (
> > > >                 select * from contact_address
> > > >                 group by primary_entity_id
> > > >                 having count(primary_entity_id) = 1
> > > >                 and is_primary = 0
> > > >         );
> > > >
> > > > Normally, I'd only return the address_id in the sub-SELECT, but I
> > > > need the is_primary column for the HAVING clause.
> > >
> > > I did some tests, and it looks like you can use aggregate functions
> > > in your HAVING clause without actually selecting the column.  So
> > > "HAVING COUNT(primary_entity_id) = 1" should work even if you only
> > > select address_id.
> >
> > Yes, that is true and it does work.
> >
> > What doesn't work however, is the extra 'AND is_primary = 0' HAVING
> > clause.
>
> Couldn't you move that up into a WHERE clause (still in the subquery)?
> It's just a regular field comparison, so it doesn't have to be in the
> HAVING clause.

No, because that's not the same thing. Imagine the following data:

address_id   primary_entity_id   is_primary
-------------------------------------------
  1            293                 0
  2            293                 1


With my query above, the sub-query result set would be empty since
count(primary_entity_id) = 2.

If I move the is_primary = 0 requirement to a WHERE clause, then the first
row would be incorrectly updated since the group function would only be
working on the sub-set of data (where is_primary = 0).

It's a subtle but important difference.

Edward


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to