php - [MySql]如何从一个表复制一行到另一个表并填充额外的列?

标签 php mysql sql database query-optimization

所以我想压缩这个查询,但我不确定如何去做。

我现在用

$move_to_sold = 
    "INSERT INTO sold_inv_item(
        `sku`,
        `designer`,
        `type`,
        `price`,
        `metal_type`,
        `stone_type`,
        `stone_weight`,
        `item_desc`,
        `item_img`
    )
    SELECT
        `sku`,
        `designer`,
        `type`,
        `price`,
        `metal_type`,
        `stone_type`,
        `stone_weight`,
        `item_desc`,
        `item_img`
    FROM inv_item
    WHERE `sku` = '$sku'";

$add_date_and_name = 
    "UPDATE sold_inv_item 
    SET `purchase_date` = '$date', `customer_name` = '$name' 
    WHERE `sku` = '$sku'";

我想要做的是将一行从一个表复制到另一个表,然后将其他数据添加到 $_POST 数据的 2 个额外列中。

我试过类似的东西

INSERT INTO sold_inv_item(`sku`,`designer`,`type`,`price`,`metal_type`,
`stone_type`,`stone_weight`,`item_desc`,`item_img`,`purchase_date`,`customer_name`) 

VALUES ((select `sku`,`designer`,`type`,`price`,`metal_type`,
`stone_type`,`stone_weight`,`item_desc`,`item_img` FROM inv_item WHERE inv_item.sku = 'pepsi-2-tone'), '2019-02-14','betty Girl');

这给出了列不匹配错误,我怀疑是因为它试图将所有行放入 1 列而不是将它们分散开。

这终于奏效了,但如果可能的话,我宁愿做类似中间解决方案的事情。

INSERT INTO sold_inv_item(`sku`,`designer`,`type`,`price`,`metal_type`,
`stone_type`,`stone_weight`,`item_desc`,`item_img`,`purchase_date`,`customer_name`) 

VALUES ((select `sku` from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select `designer` from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select `type` from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select `price` from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select `metal_type` from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select `stone_type` from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select `stone_weight` from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select `item_desc` from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select `item_img` from inv_item where inv_item.sku = 'pepsi-2-tone'),'2019-02-14','betty Girl');

所以最后的问题是,将行从一个表复制到另一个表并填充其他列的最有效代码和性能方式是什么。 有一些类似的,但我找不到超过 1-2 列被复制的内容。

最佳答案

您可以使用 INSERT ... SELECT 语法,例如:

INSERT INTO sold_inv_item (
    `sku`,
    `designer`,
    `type`,
    `price`,
    `metal_type`,
    `stone_type`,
    `stone_weight`,
    `item_desc`,
    `item_img`, 
    `purchase_date`, 
    `customer_name`
)
SELECT 
    `sku`,
    `designer`,
     `type`,
     `price`,
     `metal_type`,
     `stone_type`,
     `stone_weight`,
     `item_desc`,
     `item_img`,
     :date,
     :name
FROM inv_item
WHERE `sku` = :sku

PS:当谈到在 SQL 查询中使用 POSTed 参数时,SO 上的任何人都会强烈建议 use prepared statements and parameterized queries ,以保护您的代码免受 SQL 注入(inject),并使您的查询更高效、可读和可维护。我修改了查询以使用命名参数。

关于php - [MySql]如何从一个表复制一行到另一个表并填充额外的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54562078/

相关文章:

php - 将特定值写入数据库 X 次?

php - 如何给每个元素一个特定的 url - PHP

php - MySQL - 插入时重复父列值

sql - Scala with spark - "javax.servlet.ServletRegistration"的签名者信息与同一包中其他类的签名者信息不匹配

java - 从 hibernate 列表中选择所有项目

mysql - SQL在组MAX()值的其他列中查找行值 - MySQL

在 Javascript 中使用设置间隔函数在 IE 中无法正确调用 PHP

php - 如何让 PHP 等到为打印创建 PDF?

php - SQL - 尝试在特定位置查找可用房间(laravel 4)

mysql - vue.js的 "Firebase + Validation Example"中如何使用mysql作为数据持久化后端?