我想知道是否可以使用 INSERT INTO ... SELECT 插入和来存储和绑定select查询的结果。
工作INSERT INTO..SELECT(不存储结果):
$query = "INSERT INTO reportmessage (header, sentdate, senttime, ip)
VALUES ((SELECT header
FROM conversation
WHERE id = ?), ?, ?, ?)";
$stmt = $dbconn->prepare($query);
$stmt->bind_param('ssss', $convid, $date, $time, $ip);
if ($stmt->execute() == false) {
$flag = false;
}
$stmt->close();
如果可能,我想要完成的工作(不工作,在布尔错误上抛出调用成员函数bind_param()):
$query = "INSERT INTO reportmessage (header, sentdate, senttime, ip)
VALUES ((SELECT c.header, c.useroneFK, c.usertwoFK
FROM conversation c
WHERE c.id = ?), ?, ?, ?)";
$stmt = $dbconn->prepare($query);
$stmt->bind_param('ssss', $convid, $date, $time, $ip);
if ($stmt->execute() == false) {
$flag = false;
}
$stmt->bind_result($header, $useroneFK, $usertwoFK);
$stmt->fetch();
$stmt->close();
答案 0 :(得分:0)
因此,希望使用相同的SELECT
来插入数据并在PHP中获取结果,以避免两次查询相同的数据。我担心你不能那样做因为:
您正在执行INSERT
操作,INSERT
操作通常不返回结果集,只返回受影响的行数。您使用SELECT
获取数据不会改变它,只是INSERT
操作的另一种变体。
此外,您还希望返回INSERT
所需的值。即使您的RDBMS中有一种方法可以返回插入的数据,您只需添加插入操作不需要的任意值。
您可以通过以下几种方式获取数据:
如果您在示例中放入的查询是真实查询,则只需执行另一个SELECT
,如果您在id
上有索引,则第二个查询的额外工作几乎可以忽略不计
如果真实查询是一个非常复杂的查询,其中有很多行需要花费很长时间才能执行,您可以:
将结果存储在评论中建议的时态表中,并将其用于获取INSERT
和SELECT
的数据,以便返回结果。
或者如果插入总是一行,只需执行SELECT
,然后使用INSERT .. VALUES(...)
中的数据从PHP构造SELECT
(你可以这样做)对于更多的一行,但它会更麻烦)。