我有很多用户ID。我将这些插入到一个组表中,该表将包含用户ID和组ID的列。这将允许我使用查询“SELECT user_id FROM groups WHERE group_id ='3';”检索组3的所有成员的用户ID。
我的问题是我目前有一个所有用户ID的列表,我从表单中使用以下语句获得:
int i = 0;
String[] names = { Request.Form["usernames"]Split(' ') }; //retrieving names from form
List<int> user_ids = new List<int>();
foreach(string name in names){
int user_id = db.QueryValue("SELECT user_id FROM users WHERE username = name");
user_ids.Add(user_id); //now I have a list of all user_ids
}
我现在希望将此数据插入到groups表中,其中列表中的所有user_id值将具有相同的group_ID。我怎么能这样做?
//create a group from users
"INSERT INTO group (group_id, user_id) VALUES(?,?);
答案 0 :(得分:4)
你所谈论的是许多关系。您已有一个用户表:
**users**
userid
username
中间需要一张额外的桌子。组表将具有如下内容:
**group***
groupid
groupName
然后你会在中间有一张桌子。这个表看起来像这样:
**user_groups**
userid
groupid
您仍然可以使用您的代码插入用户
int i = 0;
String[] names = { Request.Form["usernames"]Split(' ') }; //retrieving names from form
List<int> user_ids = new List<int>();
foreach(string name in names){
int user_id = db.QueryValue("SELECT user_id FROM users WHERE username = name");
user_ids.Add(user_id); //now I have a list of all user_ids
}
在此之后,您将插入一个组:
insert into group(groupName) values("Sample Group")
然后您可以检索组ID并使用它来插入user_groups
select groupid from group where groupname="Sample Group"
insert into user_groups(userid,groupid) values(...
此外,表结构应包括主键和外键(很像@sixlettervariables'的答案)
答案 1 :(得分:2)
为了使这个更干净,你可能想稍微重构你的数据库设置,以便第三个表将用户与组相关联:
users (user_id pk, ...)
groups (group_id pk, ...)
membership (user_id fk, group_id fk) unique(user_id, group_id)
当您需要创建一个新组时,只需插入groups
表,获取group_id
,然后使用该表为每个用户填充membership
表。基。
答案 2 :(得分:0)
您可以使用select作为插入的输入
INSERT INTO group (group_id, user_id)
SELECT 1, user_id FROM users WHERE username in ("name1", name2")
您可以将名字数组与逗号一起加入。
答案 3 :(得分:0)
您需要迭代user_ids列表并为每个用户ID执行单独的insert语句。
答案 4 :(得分:0)
假设您已经知道3,您可以在不将用户ID拉入本地列表然后单独插入的情况下执行此操作(特别是因为OP在类似字符串中有查询而放入引号):
"INSERT dbo.group(group_id, user_id)
SELECT 3, user_id
FROM dbo.users
WHERE username = name;"
如果您还不知道组ID,请说明您如何确定组ID应为3。
编辑基于更多信息。
CREATE TABLE dbo.Groups
(
GroupID INT IDENTITY(1,1) PRIMARY KEY,
GroupName NVARCHAR(255) NOT NULL UNIQUE
);
CREATE TABLE dbo.GroupUsers
(
GroupID INT NOT NULL FOREIGN KEY
REFERENCES dbo.Groups(GroupID),
UserID INT NOT NULL FOREIGN KEY
REFERENCES dbo.Users(UserID),
PRIMARY KEY(GroupID, UserID)
);
现在,当您想要创建新组并向其添加用户时:
DECLARE @GroupID INT;
INSERT dbo.Groups(GroupName) SELECT N'whatever (unique)';
SELECT @GroupID = SCOPE_IDENTITY();
现在您可以遍历每个用户ID:
INSERT dbo.GroupUsers(GroupID, UserID) SELECT @GroupID, <userid>;
答案 5 :(得分:0)
您可以使用sub-select和union语句将一个表中的所有用户ID插入另一个表中,如下所示:
INSERT INTO group_table_name([user_id]) SELECT [user_id] FROM table_name
UNION ALL
顺便说一句,您可能希望更改该表名,因为“group”是SQL Server中的关键字。只是一个提示。
答案 6 :(得分:0)
插入GroupTable(GroupId,UserID)按GroupID,UserID从UserTable组中选择GroupID,USerID
这样可行:)