反对 JS - MySQL 插入和更新来自用户的选择
Objection JS - MySQL insert and update choices from User
我在如何设置 MySQL selected
关系 table 方面遇到了问题,如下所示。
&
我们的用户有一个个人资料页面,他们可以在其中从具有多个选项的下拉菜单中回答 3 个问题。
我的问题是如何在单个查询中将他们的 3 个选择添加到我的 MySQL table selected
中,以及如果需要我可以在哪里更新他们的选择。我不能使用 ON DUPLICATE KEY
,因为我的 user_id
键只是一个索引,因为每个用户将在 selected
中出现 3 次,因为每个用户有 3 个问题。
在他们的个人资料页面上,当我们的用户点击 Submit
按钮时,我希望我们的 selected
table 插入 and/or 更新 choice_id
那个用户。
我正在使用反对 JS 来设置我的模型。这是我的 User
和 Selected
模型
用户模型
class User extends Model {
static get tableName() {
return 'users';
}
static get relationMappings() {
return {
choice: {
relation: Model.HasManyRelation,
modelClass: Selected,
join: {
from: 'users.id',
to: 'selected.user_id',
},
},
user: {
relation: Model.ManyToManyRelation,
modelClass: Choices,
join: {
from: 'choices.id',
through: {
from: 'selected.user_id',
to: 'selected.choice_id',
},
to: 'users.id',
},
},
};
}
已选择模型
class Selected extends Model {
static get tableName() {
return 'selected';
}
static get jsonSchema() {
return {
type: 'object',
properties: {
id: {
type: 'integer',
},
choice_id: {
type: 'integer',
},
user_id: {
type: 'integer',
},
},
};
}
}
任何帮助检查关系 table 是否正确设置或对 MySQL 查询的帮助将不胜感激。
谢谢!
编辑 这就是我所在的位置。缺少现有答案的更新功能。
insert into selected(choice_id, user_id)
select choices.Id, users.Id from choices join users
on choices.Id in (1, 6, 10) and users.Id = 91
WHERE NOT EXISTS (
SELECT user_id FROM selected WHERE user_id = 91
) LIMIT 3;
这是您要执行的插入类型:
insert into selected(Choice_id, User_id)
select User.Id, Choices.Id
from User
join Choices
on User.Id = 12 and Choices.Id in (4, 8, 15);
您可以在服务器端使用您的实际值,而不是上面的硬编码值。如果您正在使用 PHP,那么请检查您在 $_POST
和 $_SESSION
中的内容并构建您的查询,但请确保您不允许 SQL 注入发生。
编辑
抱歉回复晚了。您可以使用不存在的标准进行插入,如下所示:
insert into selected(Choice_id, User_id)
select User.Id, Choices.Id
from User
join Choices
on User.Id = 12 and Choices.Id in (4, 8, 15)
where not exists (
select 1
from selected
where Choice_id = Choices.Id and User_id = User.id
);
但是,如果用户选择了不同的问题答案,您打算执行更新。你可以这样做
update selected
join Choices
on selected.Choice_Id = Choices.Id and Selected.User_id = 12
join Questions
on Choices.Question_id = Questions.Id and Questions.Id = 4
set Choices = 5;
假设您在执行 insert-select 之前执行了上述更新,您应该会得到您喜欢的结果。或者,您可以在插入之前创建一个触发器,它会检查该对是否已经存在,如果存在,它将更新而不是插入。
最后,我会忘记它的更新能力,因为我相信我的 selected
table 不是按 'right' 方式构建的。
每个 user_id 我应该只有一行,其中列出了 3 个选项(choice_id1、choice_id2 和 choice_id3)。像那样我可以使用 ON DUPLICATE KEY UPDATE
作为 user_id 值。
我的解决方法是在插入新值之前删除用户的所有行。
START TRANSACTION ;
DELETE FROM
selected
WHERE
user_id = 91;
INSERT INTO selected(choice_id, user_id)
select choices.Id, users.Id from choices join users
on choices.Id in (3, 5, 11) and users.Id = 91
COMMIT ;
我在如何设置 MySQL selected
关系 table 方面遇到了问题,如下所示。
我们的用户有一个个人资料页面,他们可以在其中从具有多个选项的下拉菜单中回答 3 个问题。
我的问题是如何在单个查询中将他们的 3 个选择添加到我的 MySQL table selected
中,以及如果需要我可以在哪里更新他们的选择。我不能使用 ON DUPLICATE KEY
,因为我的 user_id
键只是一个索引,因为每个用户将在 selected
中出现 3 次,因为每个用户有 3 个问题。
在他们的个人资料页面上,当我们的用户点击 Submit
按钮时,我希望我们的 selected
table 插入 and/or 更新 choice_id
那个用户。
我正在使用反对 JS 来设置我的模型。这是我的 User
和 Selected
模型
用户模型
class User extends Model {
static get tableName() {
return 'users';
}
static get relationMappings() {
return {
choice: {
relation: Model.HasManyRelation,
modelClass: Selected,
join: {
from: 'users.id',
to: 'selected.user_id',
},
},
user: {
relation: Model.ManyToManyRelation,
modelClass: Choices,
join: {
from: 'choices.id',
through: {
from: 'selected.user_id',
to: 'selected.choice_id',
},
to: 'users.id',
},
},
};
}
已选择模型
class Selected extends Model {
static get tableName() {
return 'selected';
}
static get jsonSchema() {
return {
type: 'object',
properties: {
id: {
type: 'integer',
},
choice_id: {
type: 'integer',
},
user_id: {
type: 'integer',
},
},
};
}
}
任何帮助检查关系 table 是否正确设置或对 MySQL 查询的帮助将不胜感激。 谢谢!
编辑 这就是我所在的位置。缺少现有答案的更新功能。
insert into selected(choice_id, user_id)
select choices.Id, users.Id from choices join users
on choices.Id in (1, 6, 10) and users.Id = 91
WHERE NOT EXISTS (
SELECT user_id FROM selected WHERE user_id = 91
) LIMIT 3;
这是您要执行的插入类型:
insert into selected(Choice_id, User_id)
select User.Id, Choices.Id
from User
join Choices
on User.Id = 12 and Choices.Id in (4, 8, 15);
您可以在服务器端使用您的实际值,而不是上面的硬编码值。如果您正在使用 PHP,那么请检查您在 $_POST
和 $_SESSION
中的内容并构建您的查询,但请确保您不允许 SQL 注入发生。
编辑
抱歉回复晚了。您可以使用不存在的标准进行插入,如下所示:
insert into selected(Choice_id, User_id)
select User.Id, Choices.Id
from User
join Choices
on User.Id = 12 and Choices.Id in (4, 8, 15)
where not exists (
select 1
from selected
where Choice_id = Choices.Id and User_id = User.id
);
但是,如果用户选择了不同的问题答案,您打算执行更新。你可以这样做
update selected
join Choices
on selected.Choice_Id = Choices.Id and Selected.User_id = 12
join Questions
on Choices.Question_id = Questions.Id and Questions.Id = 4
set Choices = 5;
假设您在执行 insert-select 之前执行了上述更新,您应该会得到您喜欢的结果。或者,您可以在插入之前创建一个触发器,它会检查该对是否已经存在,如果存在,它将更新而不是插入。
最后,我会忘记它的更新能力,因为我相信我的 selected
table 不是按 'right' 方式构建的。
每个 user_id 我应该只有一行,其中列出了 3 个选项(choice_id1、choice_id2 和 choice_id3)。像那样我可以使用 ON DUPLICATE KEY UPDATE
作为 user_id 值。
我的解决方法是在插入新值之前删除用户的所有行。
START TRANSACTION ;
DELETE FROM
selected
WHERE
user_id = 91;
INSERT INTO selected(choice_id, user_id)
select choices.Id, users.Id from choices join users
on choices.Id in (3, 5, 11) and users.Id = 91
COMMIT ;