【问题标题】:MySQL INSERT...SELECT for one column onlyMySQL INSERT...SELECT 仅用于一列
【发布时间】:2017-04-12 13:58:20
【问题描述】:

我想在我的表中插入多行,此查询的数据是从前端获取的。此查询中的一列不是从前端传递的,它的值是在查询执行时从另一个表中确定的。我可以将这些数组放入循环中并为每个项目执行一个 SELECT 查询和一个 INSERT 查询,但我想避免它,因此我创建了一个大型 INSERT 查询!到这里一切都很好,但是现在那个值应该来自另一个表!

我可以使用 INSERT...SELECT 方法 https://dev.mysql.com/doc/refman/5.6/en/insert-select.html

它允许插入多行,插入所有匹配的行,我可以在 SELECT 部分传递一个虚拟列值来自定义查询。但现在的问题是这些'伪造的列'对于所有行都是相同的,它们应该在循环中,每个循环都不同!如何实现?

场景

$products = array(
    "1" => array(
        "product_name" => "apple",
        "units" => "1",
    ),
     "2" => array(
        "product_name" => "mango",
        "units" => "3",
    ),
);

假设这是我从前端获得的数组,每个键都是产品 ID,其中包含购物车中产品的其他描述。现在我将其插入Orders 表中,但缺少价格,我必须从Products 表中获取!我可以使用产品 ID 执行 select

类似问题:

这个答案使用了伪造的列:

MYSQL INSERT SELECT problem

复制自已接受的答案:

INSERT INTO website (url,fid) SELECT $site,id FROM users WHERE name = $user

这里$site 对于所有插入的记录都是相同的,我希望每个记录根据我的数组不同!

我研究了这个主题,但找不到想要的答案:(

【问题讨论】:

  • Hpw 你把这两张表联系起来了吗?是一对一还是一对多的关系?
  • @manian 用虚拟场景更新了我的问题以给出一个想法。对于每个项目,一旦从另一个表返回一个值。

标签: php mysql database


【解决方案1】:

如果有帮助,试试这个代码,

<?php 
$products = array(
  "1" => array(
    "product_name" => "apple",
    "units" => "1",
  ),
  "3" => array(
    "product_name" => "mango",
    "units" => "3",
  ),
  "7" => array(
    "product_name" => "mango",
    "units" => "3",
  ),
);


$result = $conn->query("SELECT product_id, product_price FROM product_table WHERE product_id IN (".implode(',', array_keys($products)).")");
while($row = $result->fetch_assoc()) {
  $prod_price[$row['product_id']] = $row['product_price'];
}

$qry = array();
foreach ($products as $key => $value) {
   $qry[] = "('".$value['product_name']."', '".$value['units']."', '".$prod_price[ $key]."')";
}

$insert = "INSERT INTO orders (`product_name`, `units`, `product_price`) VALUES ".implode(', ', $qry);

我根据对您问题的理解提出了此代码。让我知道它是否有效。

这种方法只会命中数据库两次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多