Подтвердить что ты не робот

Вставка с использованием LEFT JOIN и INNER JOIN

Привет всем, я пытаюсь выяснить, как идти о вставке новой записи, используя следующий запрос:

SELECT user.id, user.name, user.username, user.email, 
  IF(user.opted_in = 0, 'NO', 'YES') AS optedIn  
FROM 
  user
  LEFT JOIN user_permission AS userPerm ON user.id = userPerm.user_id
ORDER BY user.id;

Мой запрос INSERT пока таков:

INSERT INTO user 
SELECT * 
FROM user 
  LEFT JOIN user_permission AS userPerm ON user.id = userPerm.user_id;

Однако я не уверен, как сделать VALUE('','','','', etc etc) При использовании левого и внутреннего соединения.

Итак, что я хочу сделать, это:

Таблица User:

id    | name       | username    | password                 | OptIn
--------------------------------------------------------------------
562     Bob Barker   bBarker       [email protected]   1

А также таблица user_permission

user_id   | Permission_id
-------------------------
562         4

ОБНОВЛЕНИЕ Так как это?

INSERT INTO user (name, username, password, email, opted_in) VALUES ('Bbarker','Bbarker','blahblahblah','[email protected]',0);
INSERT INTO user_permission (user_id, permission_id) VALUES (LAST_INSERT_ID(),4);
4b9b3361

Ответ 1

Вы должны быть конкретными о столбцах, которые вы выбираете. Если в таблице user было четыре столбца id, name, username, opted_in, вы должны выбрать именно те четыре столбца из запроса. Синтаксис выглядит так:

INSERT INTO user (id, name, username, opted_in)
  SELECT id, name, username, opted_in 
  FROM user LEFT JOIN user_permission AS userPerm ON user.id = userPerm.user_id

Однако, по-видимому, нет никаких оснований присоединяться к user_permission здесь, так как ни один из столбцов из этой таблицы не будет вставлен в user. На самом деле, этот INSERT, похоже, не работает с нарушениями уникальности первичного ключа.

MySQL не поддерживает вставки в несколько таблиц одновременно. Вам либо нужно выполнить два оператора INSERT в вашем коде, используя последний идентификатор вставки из первого запроса, либо создать триггер AFTER INSERT в первичной таблице.

INSERT INTO user (name, username, email, opted_in) VALUES ('a','b','c',0);
/* Gets the id of the new row and inserts into the other table */
INSERT INTO user_permission (user_id, permission_id) VALUES (LAST_INSERT_ID(), 4)

Или используя trigger:

CREATE TRIGGER creat_perms AFTER INSERT ON `user`
FOR EACH ROW
BEGIN
  INSERT INTO user_permission (user_id, permission_id) VALUES (NEW.id, 4)
END

Ответ 2

вы не можете использовать предложение VALUES при вставке данных с помощью другого запроса SELECT. см. INSERT SYNTAX

INSERT INTO user
(
 id, name, username, email, opted_in
)
(
    SELECT id, name, username, email, opted_in
    FROM user
         LEFT JOIN user_permission AS userPerm
            ON user.id = userPerm.user_id
);

Ответ 3

INSERT INTO Test([col1],[col2]) (SELECT a.Name AS [col1],b.sub AS [col2] FROM IdTable b INNER JOIN Nametable a ON b.no = a.no)