Hello,

I've recently came across a problem I couldn't seem to solve right by myself.

I have a db with objects table, each of those objects may belong to groups
of objects. The number of groups can be about 256 and an object
belongs from one to many different groups at once.

I cannot find a good way to store/select information about groups for
objects that belong to several groups.

My first idea was to put a 'groups' column and keep there the
id_numbers of groups to which particular object belongs to (with
separators). So the groups column would have values like '100,203,204,208'
etc. Of course this is not the right way to do it as those values are not
atom and the lenght of the field may easily grow out of tinytext length
type I was using...

It worked ok though for small number of groups and objects though I
know this was a perfect example of how *not* do do it in a RDB... If
I wanted an object that belonged to 2 groups (100 and 203 for example)
I would do "SELECT [...] LIKE '%100%203%'".

My next attempt was to create separate table with object_id and
group_id column, this way an object that belongs to many groups would have
several rows in the table. If I wanted to know what are the groups
that my object belongs to - a piece of cake. But things get really rough if
I want to get objects that (for example) belong to two particular (1 &
2) groups. I would go with something like that:

SELECT DISTINCT(g1.object_id) FROM connecting_table as g1, connecting_table
as g2 WHERE g1.group_id = 1 AND g2.group_id = 2 AND g1.object_id =
g2.object_id;

But this is getting more and more complex if I want to select objects
that belong to 3, 4 and N groups at once :/ The first solution
although very ugly seems to be much more clearer (and maybe even more
efficient for groupn number of 2+?).

My working solution for now is to have a separate table with object_id
and groups_id1 column of INT type, I have assigned the first 31 existing
groups to corresponding bits of the INT field. That is if I want to
select objects that belong to the groups that have ids of 1,3,5 and 26 i
would set the bits nr 1,2,4 and 26 of a variable $MY_INT and then query:

SELECT object_id,groups_id1 FROM connecting_table WHERE
BIT_COUNT(groups_id1 & $MY_INT) = 4;

this seems to give me what I want but now if I want to add next 31
groups I need to create another groups_id2 column and things again
get a bit complicated - I need now to check in which column the
current group flag I need to find out may be stored and act
accordingly (so groups with id 1-31 in column groups_id1, groups 32-63 in
groups_id2 etc). Not a big problem and this solutions seems to be quite
cheap (is it?) but somehow I am feeling there is a better way to
do all this...

Sorry for this long letter I hope I have managed to put the problem
straight, I may miss something obvious here but as I
said I have limited knowledge about sql. I would be much grateful for any
tips.


------------------------
Lecho


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

Reply via email to