* Jonathan Soons
> I have a table 'organisms' with a field 'category'
> of type SET('birds','bees','flowers','trees').
> A record could have none or more of these in that field.
> How do I select all records with both 'flowers' and 'trees'?
> I can "SELECT category,key FROM organisms;"
> Then I can test for the strings 'flowers' && 'trees' in the result set
> and then do another select for those id's but that's obviously
> the slow way.
A SET column is actually storing integers, each set value represent an
integer value, the powers of two. In your set
('birds','bees','flowers','trees') the following integers are used: birds=1,
bees=2, flowers=4 and trees=8.
To test for a combined value, you simply add the relevant integers. To get
rows with both 'flowers' and 'trees' and possibly other, you could do a test
if "category & 12 = 12". If you only want those with 'flowers' and 'trees'
and no other categories, test if "category = 12"
You can also use the LIKE oerator with the SET column, treating it as a
string. This is probably easier. It would be something like this:
SELECT * FROM organisms WHERE category LIKE "%flowers%trees%";
In this case you could have used LIKE "%flowers,trees", but the above syntax
is more scalable, you could add other categories to your SET later.
Only those with 'flowers' and 'trees' and no other categories:
... LIKE "flowers,trees";
(The order is relevant here, "trees,flowers" will not work.)
<URL: http://www.mysql.com/doc/en/SET.html >
--
Roger
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]