如何在mysql查询中选择多个外键

如何在mysql查询中选择多个外键,mysql,sql,insert,foreign-keys,subquery,Mysql,Sql,Insert,Foreign Keys,Subquery,所以我想使用mysql在表中插入一个新列 下面是一个来自W3S的insert into函数示例 INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country='Germany'; 为了从另外两个表中选择和插入特定的整数值,我尝试对其进行了一些修改。我试过几种不同的方法,但运气不好。以下是我大致想要做的: INSERT INTO table0 (int

所以我想使用mysql在表中插入一个新列

下面是一个来自W3S的insert into函数示例

INSERT INTO Customers (CustomerName, Country)
SELECT SupplierName, Country FROM Suppliers
WHERE Country='Germany';
为了从另外两个表中选择和插入特定的整数值,我尝试对其进行了一些修改。我试过几种不同的方法,但运气不好。以下是我大致想要做的:

INSERT INTO table0 (integerVar1, integerVar2, booleanVar1)
SELECT int1 FROM table1 WHERE aString = "something",
       int2 FROM table2 WHERE bString = "otherthing",
       0;

上面的代码不是有效的语法。我需要调整什么才能做出选择?还是我必须尝试完全不同的东西?非常感谢。

只要子查询只返回一行(),以下内容将适用于您:


如果它们可能返回多行,则应通过更详细的where子句或使用limit子句缩小结果范围。

您需要将每个结果都包含在一个子选择中,如下所示:

INSERT INTO table0 (integerVar1, integerVar2, booleanVar1)
SELECT (SELECT int1 FROM table1 WHERE aString = 'something'),
       (SELECT int2 FROM table2 WHERE bString = 'otherthing'),
       0;
但是,请记住,如果子选择返回了多个值,则它将不起作用

这将更安全地使用:

INSERT INTO table0 (integerVar1, integerVar2, booleanVar1)
SELECT (SELECT int1 FROM table1 WHERE aString = 'something' LIMIT 1),
       (SELECT int2 FROM table2 WHERE bString = 'otherthing' LIMIT 1),
       0;

其他答案显示了如何使用子查询检索所需的值。我想补充一点,因为您[似乎]希望每个字符串都有一个匹配项,所以您也可以使用
INSERT…VALUES
语法,而不是
INSERT…SELECT

INSERT INTO table0 (integerVar1, integerVar2, booleanVar1)
VALUES
(
  (SELECT int1 FROM table1 WHERE aString = 'something'),
  (SELECT int2 FROM table2 WHERE bString = 'otherthing'),
  0
);
但那只不过是一种句法上的变化(在这种特殊情况下)

实际上,我想提请您注意的是,两个子查询中的每一个子查询都可能返回一个空集,因此计算结果为标量NULL。如果其中一个或两个引用都为NULL,是否仍要插入该行

如果您希望在这种情况下不插入一行,则可以考虑这种方法:

INSERT INTO table0 (integerVar1, integerVar2, booleanVar1)
SELECT
  t1.int1, t2.int2, 0
FROM
  (SELECT int1 FROM table1 WHERE aString = 'something') AS t1
CROSS JOIN
  (SELECT int2 FROM table2 WHERE bString = 'otherthing') AS t2
;

如果其中一个子查询不返回行,则两个集合的交叉联接将为空,因此INSERT不会将任何行插入到
表0

中。请使用英语描述您要执行的操作。“基本上”和“粗略地”不会神奇地传达你想要什么,也不会让你不说你想要什么。同时给出定义表的SQL语句。也要始终给出准确的错误消息。关于多个匹配,这一点很好,不过,如果查询返回OP期望的多行,我认为这应该在设计级别解决。
INSERT INTO table0 (integerVar1, integerVar2, booleanVar1)
SELECT
  t1.int1, t2.int2, 0
FROM
  (SELECT int1 FROM table1 WHERE aString = 'something') AS t1
CROSS JOIN
  (SELECT int2 FROM table2 WHERE bString = 'otherthing') AS t2
;