Возражение JS - MySQL вставить и обновить варианты от пользователя - PullRequest
1 голос
/ 16 апреля 2020

У меня возникла проблема с настройкой таблицы отношений MySQL selected, как показано ниже.

enter image description here & enter image description here

У наших пользователей есть страница профиля, где они могут ответить на 3 вопроса из выпадающего меню с несколькими вариантами. enter image description here

Мой вопрос заключается в том, как добавить их 3 варианта в мою MySQL таблицу selected в одном запросе и где я могу обновить их варианты, если это необходимо. Я не могу использовать ON DUPLICATE KEY, поскольку мой ключ user_id является только индексом, поскольку каждый пользователь будет отображаться 3 раза в selected, поскольку на каждого пользователя приходится 3 вопроса.

На их странице профиля, когда наши пользователи нажимают кнопку Submit. Я бы хотел, чтобы наша таблица selected вставила и / или обновила 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',
        },
      },
    };
  }
}

Любая помощь, чтобы проверить, правильно ли настроена таблица отношений или помощь с запросом 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;

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

В конце я забуду эту возможность обновления, поскольку я считаю, что моя таблица selected построена не так, как надо.

У меня должна быть только одна строка на 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 ;
0 голосов
/ 16 апреля 2020

Этот тип вставки вы хотите выполнить:

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 внедрение.

EDIT

Извините за поздний ответ. Вы можете выполнить вставку с критериями несуществования, например:

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;

Предполагая, что вы выполняете обновления, как описано выше, прежде чем выполнять операцию вставки-выбора, вы должны получить желаемый результат. В качестве альтернативы вы можете создать триггер перед вставкой, который будет проверять, существует ли пара, и если да, он будет обновляться вместо вставки.

...