反对 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 来设置我的模型。这是我的 UserSelected 模型

用户模型

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 ;