Yes, it's true that the query won't work if you have duplicate aid,bid 
rows.  I probably shouldn't have assumed that there would be a PK or 
unique constraint on aid,bid.  So if that isn't the case, you can add a 
distinct:

SELECT AID
FROM AhasB 
WHERE BID in (1,2)
GROUP BY AID
HAVING count(distinct BID) =2

Donna




Peter Brawley <[EMAIL PROTECTED]> 
11/28/2006 10:53 AM
Please respond to
[EMAIL PROTECTED]


To
James Northcott / Chief Systems <[EMAIL PROTECTED]>, 
"mysql@lists.mysql.com" <mysql@lists.mysql.com>
cc

Subject
Re: Many-Many relation, matching all






James Northcott / Chief Systems wrote:

 >SELECT AID
 >FROM AhasB WHERE BID in (1,2)
 >GROUP BY AID
 >HAVING count(BID) =2

Not quite, since that will catch aid's with two bid=1 rows or bid=2 rows:

SELECT * FROM t;
+------+------+
| i    | j    |
+------+------+
|    1 |    4 |
|    1 |    5 |
|    3 |    5 |
|    3 |    5 |
+------+------+
SELECT i
FROM t WHERE j in (4,5)
GROUP BY i
HAVING count(j) =2;
+------+
| i    |
+------+
|    1 |
|    3 |
+------+
SELECT i,GROUP_CONCAT(j) AS list
FROM t
GROUP BY i
HAVING list='4,5';
+------+------+
| i    | list |
+------+------+
|    1 | 4,5  |
+------+------+

PB

-----

> Peter Brawley wrote:
>> >I want to find all A's such that
>> >they have exactly B's 1 and 2
>> >SELECT A.ID, group_concat(BID ORDER BY BID) as Bs
>> >FROM A INNER JOIN AhasB ON A.ID=AID
>> >GROUP BY A.ID
>> >HAVING Bs='1,2'
>>
>> Why the join? Doesn't your ahasb bridge table already incorporate the 
>> join logic? If your requirement is to retrieve all aid's with exactly 
>> one instance of bid=1, exactly one with bid=2, and no other bid's, 
>> why not just ...
>>
>> SELECT aid,GROUP_CONCAT(bid) AS list
>> FROM ahasb
>> GROUP BY aid
>> HAVING list='1,2';
>>
>> PB
>>
> I actually need some of the other columns from A, but you're correct, 
> this does work.  I did discover though that the ORDER BY in the 
> group_concat is important, since MySQL doesn't always pick the same 
> order for the list.
>
> [EMAIL PROTECTED] wrote:
>> I think this will work:
>>
>> SELECT AID
>> FROM AhasB WHERE BID in (1,2)
>> GROUP BY AID
>> HAVING count(BID) =2
>>
>>
>> Donna
>> 
>
> Thank you, this is actually very helpful.  The where clause uses the 
> index I have in the table to screen out many more rows early in the 
> query, and it also very nicely avoids the string compare on the 
> group_concat.  I also wasn't aware that you could use an aggregate 
> function in the HAVING clause without it appearing in the SELECT clause.
>
> Thanks again, this solves the problem quite elegantly, and I probably 
> never would have thought of it.
>


-- 
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.409 / Virus Database: 268.14.19/555 - Release Date: 
11/27/2006


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


-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.



CONFIDENTIALITY NOTICE:This email is intended solely for the person or 
entity to which it is addressed and may contain confidential and/or 
protected health information.  Any duplication, dissemination, action 
taken in reliance upon, or other use of this information by persons or 
entities other than the intended recipient is prohibited and may violate 
applicable laws.  If this email has been received in error, please notify 
the sender and delete the information from your system.  The views 
expressed in this email are those of the sender and may not necessarily 
represent the views of IntelliCare.

Reply via email to