Hi Edward,

Edward Kay wrote:
I have a table of addresses. Each address is associated with a primary
entity and a primary entity can have n different addresses. For each primary
entity, one address is marked as the main address.

I need a query to return all addresses that are the only address associated
with the primary entity but aren't marked as the main address.

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.

There are two issues. 1) MySQL optimizes IN() subqueries very badly, and 2) as you see a scalar subquery can only return one column here. I suggest you rewrite it as a join:

update contact_address
        inner join (
                select address_id ...
        ) as X using(address_id)
        set is_primary = 1;

Baron

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

Reply via email to