SQL INSERT INTO 和 JOIN

问题描述 投票:0回答:2

我正在尝试提出一个 MySQL 查询,它将在一个表中插入数据以及来自其他表的数据。

这是我的结构:

表1:

ID   killerid     playerid     weapon

表2:

ID     playername

现在我想将 where 子句中两个名称的 ID 插入到

table1
killerid
列中的
playerid
中。

但这行不通:

INSERT INTO table1 (killerid)
    SELECT t1.id
    FROM table1 t1
    LEFT JOIN table2 t2 ON (t2.killerid = t1.id)
    WHERE t2.playername = 'example'

更好理解:

我希望这样可以更好地理解 - 这是我的桌子

USERS

ID   |   playername [...]
-----|-------------------
1    |   example1
2    |   example2

还有我的桌子

KILLS

ID   |  killerid  |  victimid  |  weapon
-----|----------------------------------
 1   |    1       |     2      |   FIST
 2   |    2       |     1      |   PISTOL

我想在

KILLERS
中插入凶手 (
killerid
) 和受害者 (
victimid
) 的 ID,但插入时我只有 2 个名字(example1 和 example2)。

所以我必须在我的表中获取这两个名字的 ID

USERS

喜欢(伪例子):

INSERT INTO `KILLERS`(`killerid`, `victimid`, `weapon`)
VALUES(
  USERS.ID WHERE USERS.playername = 'example1',
  USERS.ID WHERE USERS.playername = 'example2',
  'FIST'
 );

应插入以下内容:

ID   |  killerid  |  victimid  |  weapon
-----|----------------------------------
 1   |    1       |     2      |   FIST

我希望这是清楚的。

mysql join insert left-join
2个回答
1
投票

根据您获得的数据,您似乎可以按如下方式完成部分工作:

INSERT INTO table2(killerid, playerid, weapon)
  SELECT t1.id as killerid,  -- the 'as killerid' is not required but is useful 
         t1.playerid,        -- to help understand what's intended
         t1.weapon
    FROM table1 t1
    LEFT OUTER JOIN table2 t2
      ON t2.killerid = t1.id
    WHERE t2.playername = 'example'

编辑

现在我们有了表结构,解决方案就更容易找出了。

INSERT INTO kills (killerid, victimid, weapon)
  SELECT u1.ID as killerid,
             u2.ID as victimid,
             d.weapon
    FROM USERS u1
    INNER JOIN USERS u2
      ON 1 = 1
    INNER JOIN (SELECT 'FIST' as weapon
                  FROM DUAL) d
      ON 1 = 1
    WHERE u1.playername = 'example1' AND
          u2.playername = 'example2';

SQLFiddle 在这里

分享并享受。


0
投票

你的sql说:

您需要在varo_lastkills表中有一些值,例如varo_users表,如果您没有一致的值,则查询不会运行

© www.soinside.com 2019 - 2024. All rights reserved.