Invoegen met LEFT JOIN en INNER JOIN

Hallo allemaal, ik probeer erachter te komen hoe ik een nieuw record kan invoegen met behulp van de volgende vraag:

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;

Mijn INSERT-zoekopdracht tot nu toe is deze:

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

Ik weet echter niet zeker hoe ik VALUE('','','','', etc etc)moet doen bij het gebruik van left en inner joins.

Dus wat ik wil doen is dit:

Tabel

user:

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

En ook de tabel user_permission

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

UPDATE
Dus zoals dit?

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);

Antwoord 1, autoriteit 100%

U moet specifiek zijn over de kolommen die u selecteert. Als uw user-tabel vier kolommen id, name, username, opted_inhad, moet u precies die vier kolommen uit de zoekopdracht selecteren. De syntaxis ziet er als volgt uit:

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

Er lijkt echter geen reden te zijn om hier tegen user_permissionmee te doen, aangezien geen van de kolommen uit die tabel zou worden ingevoegd in user. In feite lijkt deze INSERTonvermijdelijk te mislukken bij schendingen van de uniciteit van de primaire sleutel.

MySQL ondersteunt geen invoegingen in meerdere tabellen tegelijk. U moet ofwel twee INSERT-instructies in uw code uitvoeren, met de laatste invoeg-ID van de eerste query, of een AFTER INSERT-trigger maken op de primaire tabel.

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)

Of met een 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

Antwoord 2, autoriteit 32%

u kunt de VALUES-clausule niet gebruiken bij het invoegen van gegevens met een andere SELECT-query. zie SYNTAX INVOEREN

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
);

Antwoord 3, autoriteit 4%

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
)

Other episodes