Создание группы пользователей на PHP и MySQL - PullRequest
3 голосов
/ 06 сентября 2011

Мне интересно, как я могу использовать JOIN или LEFT JOIN для группировки пользователей.

таблица пользователей:

id (primary)
user (varchar)
pass (varchar)
email (varchar)
website (varchar)
bio (text)
avatar (varchar)
code (varchar)
active (varchar)
admin (varchar)
group_1 (int) <--- I have a feeling that this is the wrong way to go about it
group_2 (int) <---
group_3 (int) <---

таблица групп:

group_id (primary key)
group_name (varchar)
group_bio (text)
group_website (varchar)

Мне было интересно, как я могу позволить члену входить в несколько групп и отображать список членов определенной группы.

Примерно так:

Group Name
Users: <a href='profile'>Name</a>, <a href='profile'>Name</a>, <a href='profile'>Name</a>, <a href='profile'>Name</a>

Я понятия не имею, как это сделать. Пожалуйста, помогите.

Ответы [ 3 ]

7 голосов
/ 06 сентября 2011

Вы хотите стандартное отношение «многие ко многим» .

Обычно это делается с помощью трех таблиц.

  1. Пользователи
  2. Группы
  3. Членство

Таблица членства будет иметь два внешних ключа, которые отображаются на две другие таблицы.

2 голосов
/ 06 сентября 2011

Вы должны создать новую таблицу MEMBER_GROUPS с двумя полями: user_id и group_id .
Каждая строка является членством пользователя ...
Таким образом, вы можете легко запросить членство пользователя в группе ...

1 голос
/ 06 сентября 2011

Это действительно неправильный подход, поскольку он ограничивает членство пользователя в трех группах. Это классическое отношение «многие ко многим», и вы можете смоделировать его с помощью таблицы 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
...