Это действительно неправильный подход, поскольку он ограничивает членство пользователя в трех группах. Это классическое отношение «многие ко многим», и вы можете смоделировать его с помощью таблицы bridge:
user_group
----------
user_id
group_id
Первичный ключ будет составным из user_id
и group_id
, обеспечивающим уникальность. Тогда вы бы сделали двойное соединение через эту таблицу. Например, чтобы получить всех членов всех групп:
SELECT group.*, user.*
FROM group
LEFT OUTER JOIN user_group
ON group.group_id = user_group.group_id
LEFT OUTER JOIN user
ON user_group.user_id = user.user_id
Или, если вы после определенной группы:
SELECT user.*
FROM user_group
INNER JOIN user
ON user_group.user_id = user.user_id
WHERE user_group.group_id = ?
Вы можете даже получить список всех групп с количеством участников:
SELECT group.*, COUNT(user_group.user_id) AS group_membership_count
FROM group
LEFT OUTER JOIN user_group
ON user_group.group_id = group.group_id
GROUP BY group.group_id