我有以下表格
users: uid, name_f, name_l...
group_data: id, group_id, admin, invitedusers, subscribers...
例如,当用户"uid:4"创建一个组并邀请他的朋友"uid:7"answers"uid:9"时,我将其插入组数据表:
'admin:4, invitedusers:4,7,9, subscribers:4,7,9'. I
例如,如果uid:9不想接收通知,我只需将他/她从逗号分隔的列表、订阅者中删除,使其成为'subscribers:4,7'
。当管理员从组中删除用户时,我也会这样做,只是我更改了invitedusers列。
我知道这个设置有很大的缺陷,我必须为受邀者和订阅者创建一个新的表。我只是在寻找一种创建该表的方法,以及一个选择新系统中所有用户的sql查询。
任何帮助都将不胜感激。此外,这个答案有点触及主题,但我不太理解结构参考,无法实现它:SQL数组搜索
你应该有一个表,每个用户都有一行,就像你已经做的那样。称之为"users"。此表将只包含有关用户的信息,而不是用户所在的组
你应该有另一个表,每个组一行,你做到了。称之为"groups"。此表将只包含有关组的信息,而不包含组中的人员。
你应该有一个第三个表,每个用户所在的组都有一行。可以称之为"user_groups"之类的。该表中的每一行都将"users"表中的一个用户链接到"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)");
糟糕的性能,但对于一次性来说已经足够了
-- 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