我有以下表格
users: uid, name_f, name_l...
group_data: id, group_id, admin, invitedusers, subscribers...
当用户,'uid:4'例如创建一个组并邀请他的朋友'uid:7'和uid:9'我插入到group_data表中:
'admin:4, invitedusers:4,7,9, subscribers:4,7,9'. I
例如,如果uid:9不想接收通知,我只需将他/她从逗号分隔的列表中移除,订阅者将其设为'subscribers:4,7'
当管理员删除用户时我也会这样做来自该组,除了我改变了inviteusers专栏。
据我所知,这个设置存在很大缺陷,我必须为受邀用户和订阅者创建一个新表。我只是在寻找一种创建该表的方法,以及一个选择新系统中所有用户的SQL查询。
非常感谢任何帮助。此外,这个答案有点触及了这个主题,但我不太了解结构参考,也无法实现它:SQL Array Search
答案 0 :(得分:3)
对于每个存在的用户,您应该拥有一个包含一行的表,就像您已经做过的那样。称之为“用户”。此表将仅包含有关用户的信息,而不是他们所在的组。
您应该有另一个表,每个组都有一行,您可以这样做。称之为“群组”。此表将仅包含有关该组的信息,而不是其中的人员。
对于他们所在的每个组,您应该为每个用户创建第三个表,其中包含一行。将其称为“user_groups”或其他内容。此表中的每一行都会将“用户”表中的一个用户链接到“组”表中的一个组,并可能提供有关他们对该组的订阅的信息。
示例设置可能如下所示:
CREATE TABLE users (
userID INT,
firstName VARCHAR,
lastName VARCHAR,
PRIMARY KEY (userID)
);
CREATE TABLE groups (
groupID INT,
groupName VARCHAR,
adminUserID INT, /* this is the userID of the one and only administrator of this group */
PRIMARY KEY (groupID)
);
CREATE TABLE user_groups (
userID INT,
groupID INT,
invited TINYINT, /* 0 or 1 to indicate true or false */
subscribed TINYINT /* 0 or 1 to indicate true or false */
);
<小时/> 编辑回答评论中的问题:
$groupID = 1;
$userIDArray = explode(",", $row["invitedusers"]); // assuming that $row is a row from the old group_data table
foreach ($userIDArray as $userID)
mysql_query("INSERT INTO user_groups (userID, groupID, invited) VALUES ('". mysql_real_escape_string($userID) ."', '". mysql_real_escape_string($groupID) ."', 1)");
答案 1 :(得分:0)
性能糟糕,但一次性足够好:
-- create table
CREATE TABLE invitedusers (group_data_id integer,user_id integer, PRIMARY KEY(group_data_id,user_id));
-- insert existing users
INSERT IGNORE INTO invitedusers (group_data_id,user_id)
SELECT g.id, u.id
FROM users u
JOIN group_data g
ON FIND_IN_SET(u.id,g.invitedusers) > 0