I think you can get those rows that have multiple colors, if you know
the list of colors to check for...
Maybe this can help...

SELECT itemID 
from theTable
Where colorID in (1,2,3,4,...N)
Group by itemID
Having count(*) = N;

This will only return the itemID if it appears in all of the colors
listed, *unless* an item can be listed in a color
More than once.  In that case, it'll return false rows.  

Kevin

-----Original Message-----
From: gamin [mailto:[EMAIL PROTECTED] 
Sent: Thursday, June 12, 2003 3:33 PM
To: danchik; Fred Whipple; [EMAIL PROTECTED]
Subject: Re: again with SELECT


> thats effectively an OR statement, isnt it?
>
> how would i select the itemsIDs that have all the requested colors?
>
> for example if data was:
> id    :    colorID    :    itemID
> -----------------------------
> 1            1                  1
> 2            1                  2
> 3            1                  3
> 4            2                  1
> 5            2                  4
>
> and i want the ones that are of color 1 AND 2 i should get back itemID
> 1
>
> (since its the only one with both specified colors)
>

Normally (this is what most ppl would think), for a given item you have
one single unique color, but as i see this is not in your case. You
should reorganize your tables. But if for some reason you cannot, here
is a suggestion (just off my head).

Assuming that colorIDs do not take very large values.

To each colorID you assign a unique prime number (maintain this in a
table). For each itemID now you have a unique colorPRODUCT (product of
the prime numbers coressponding the various colorIDs for this itemID).
To add a colorID to an itemID simply muliply the new prime
(coressponding to the colorID being added) to the old colorPRODUCT. In
the same way to remove a colorID devide colorPRODUCT by the
corressponding prime. And to find the itemID which has a particular set
of colors just check for the colorPRODUCT.

I dont think deleting will be such a problem also, say you want to
delete all items which have colorID = 2. Find the corresponding prime,
lets say it is P then you simply need to check if mod(colorPRODUCT, P) =
0. Of course no indexes can be used directly.

Well, not such a bright suggestion !!

G




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



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

Reply via email to