【问题标题】:MYSQLI Prepared Statement Insert and lookup value From other tableMYSQLI Prepared Statement 从其他表插入和查找值
【发布时间】:2019-10-27 12:43:20
【问题描述】:

我有一个准备好的语句,它基本上将数组中的数据插入到表中。但是我需要从数据库中的另一个表中获取其中一列。到目前为止,我想出了这个。

$query = "INSERT INTO stockimp si (sku,stock,status,productID) 
          VALUES (?,?,?,(SELECT post_id FROM postmeta pm  
          WHERE si.sku = pm.meta_value AND pm.meta_key = '_sku')) ";

$stmt = $mysqli->prepare($query);
$stmt ->bind_param("sss", $dbSKU, $dbStock, $dbStatus);
$mysqli->query("START TRANSACTION");

如果我删除 select 语句以获取帖子 ID 并将其设置为静态值,它将正常工作。但我现在不确定在这里采取的最佳方法。如果它只是表的直接副本,但我只是从列中获取一个值,我知道该怎么做,我不太确定。

【问题讨论】:

  • 您可能会遇到的问题是,如果您的子选择返回多行。为什么不在此之前的单独查询中选择post_id,然后将其与其余参数绑定?
  • @Phil 我试图将事情保持在最低限度。数据库正在与数十万行进行交互。在一个查询中为每一行查找数据库将对资源产生相当大的影响。作为准备好的事务,它将批量运行并在瞬间完成
  • “在一个查询中为每一行查找数据库将对资源产生相当大的影响” ????你知道这是事实吗?
  • 是的,我已经完成了。如果您的 loppying 每次抛出 10 万行并打开对数据库的查询以获得相当于 10 万数据库查询的值。我已经做到了,影响非常大。因此希望将其作为单个事务进行
  • @phil P.s.如果我遗漏了一些明显的东西,就说我现在是凌晨 3 点,而我此时并没有完全清醒。

标签: php mysql mysqli


【解决方案1】:

我真的不确定你在用 SELECT 语句做什么,尤其是在你有 si.sku = pm.meta_value 的地方,因为你要插入到 si 表中。

在任何情况下,您都可以尝试使用INSERT...SELECT 代替SELECT 中的一些参数化值。

例如

$sql = <<<_SQL
INSERT INTO stockimp (sku, stock, status, productID)
SELECT ?, ?, ?, pm.post_id
FROM postmeta pm
WHERE pm.meta_key = '_sku' AND pm.meta_value = ?
_SQL;

$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ssss', $dbSKU, $dbStock, $dbStatus, $dbSKU);
foreach ($arrayValues as list($dbSKU, $dbStock, $dbStatus)) {
    $stmt->execute();
}

注意参数列表中重复的$dbSKU


就个人而言,我只想使用几个陈述。假设您的 $db* 值来自值数组...

// Prepare first, then loop for best performance
$postStmt = $mysqli->prepare(
        "SELECT post_id FROM postmeta WHERE meta_key = '_sku' AND meta_value = ?");
$postStmt->bind_param('s', $dbSKU);

$inStmt = $mysqli->prepare(
        'INSERT INTO stockimp (sku, stock, status, productID) VALUES (?, ?, ?, ?)');
$inStmt->bind_param('sssi', $dbSKU, $dbStock, $dbStatus, $postId);

foreach($arrayOfValues as list($dbSKU, $dbStock, $dbStatus)) {
    $postStmt->execute();
    $postStmt->bind_result($postId);
    while($postStmt->fetch()) {
        $inStmt->execute();
    }
}

【讨论】:

  • 嗨,菲尔,实际上我刚刚想出了与您的第一个类似的东西。现在测试
  • 我觉得你也应该考虑第二个,至少对比一下实际表现
  • 第一个运气不好
  • 这是什么意思?它会抛出错误吗?什么不工作?
  • 对不起,由于表名的错误。我没有提供确切的内容,但在测试时忘记更改它。它现在正在运行。我已经让 php tdoing 执行时间使用时间和运行时间,所以我试试那个和第二个对比
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
相关资源
最近更新 更多