MySQL:向表中插入多行数据,其中一些数据来自另一个表(关系表)


MySQL: Insert multiple rows of data into table, some data comes from another table (relational)

MySQL的附加问题:插入数据到表中,一些数据来自另一个表(关系)

我上面的问题基本上是问"我如何使用在另一行中找到的信息将一行插入到表中"。答案是使用如下查询:

INSERT INTO user_config(cid, sid, value)
SELECT $cid, id, $value
FROM user_settings
WHERE mid='$mid' AND name='$name'
ON DUPLICATE KEY UPDATE value = $value;

我现在的问题是,我需要插入多行。对于我需要插入的每一行,$cid, $value, $mid$name都有不同的值。例如,我可以运行以下命令(伪):

function x($cid, $mid, $name, $value){
    // run query:
    INSERT INTO user_config(cid, sid, value)
    SELECT $cid, id, $value
    FROM user_settings
    WHERE mid='$mid' AND name='$name'
    ON DUPLICATE KEY UPDATE value = $value;
}
x(1,'a','b');
x(2,'c','d');
x(3,'f','e');

问题是,这将运行3查询,我希望能够做到这一点在一个。这可能吗?我可以为$cid, $mid$name提供一个数组,如果这有助于解决问题?

假设x调用中的信息可以表示为对数据库中各种表的选择。您的x个调用列表看起来像一个表,其列是$cid, $mid, $name, $value,对吗?(你的x调用应该有4个参数,而不是3个)

给出表的定义和一个查询,该查询将x参数生成一个包含cid, mid, name, value列的表。

然后修改问题中的select,使x select在FROM中。当然,您可能不必使用子选择来表示更新;我只是描述了在你给出的语法中添加语法的变化。

更新

您可以创建一个(可能是临时的)表作为x选择。把那张表放到FROM里。如果当你收集多个x参数列表时,表就在周围,那么你可以在得到它时插入每个(cid,mid,name,value)。

INSERT INTO user_config (cid, sid, value)
SELECT cid, id, value
FROM user_settings s JOIN x
ON s.mid=x.mid AND s.name=x.name
ON DUPLICATE KEY UPDATE value = x.value;