如何从另一个表向MySQL中的表添加数据 和 FORM 输入

How Do I add data to a table in MySQL from another table And FORM inputs

提问人:Ahmad Khaled 提问时间:7/10/2023 最后编辑:Ahmad Khaled 更新时间:7/17/2023 访问量:92

问:

我目前正在处理 Web 开发人员工作的任务。任务是创建一个简单的产品列表并添加产品页面。

棘手的部分是,在添加产品页面上,有始终可见的输入,例如:

  • 产品名称
  • 产品 SKU
  • 产品价格
  • 产品类型(数字、书籍、家具)

以及指定产品类型时的另外一个或多个输入字段。

这是设计应该是什么样子的图片:任务 mochup

在数据库中,我创建了 4 个表,如下所示:

数据库设计方案


下面是来自 add-product 表单的数据示例:

$_POST['name'];
$_POST['sku'];
$_POST['price'];
$_POST['typeId'];
// incase the typeId == 1
$_POST['size'];
// incase the typeId == 2
$_POST['weight'];
// incase the typeId == 3
$_POST['height'];
$_POST['width'];
$_POST['length'];

对于名称,SKU和价格;它们将被添加到产品表中。

typeId 已经存储在product_category表中,如下所示:

编号 类别
1 DVD光盘
2
3 家具

以下是variant_name表:

编号 名字 product_category_id
1 大小 1
2 重量 2
3 高度 3
4 宽度 3
5 长度 3

这是type_variants表:

编号 var_name_id
1 1 10
2 2 20
3 3 ##
4 4 ##
5 5 ##

我的想法是将值插入type_variants表,然后将该值连接到variant_name,以便我可以将值分别添加到表中。$_POST['typeId']

这是我通常运行的 sql 命令:

INSERT INTO `type_variants`(`var_name_id`, `values`)
-- select the id form variant names table
SELECT name.id
FROM variant_name AS name JOIN product_category AS cat ON name.product_category_id = cat.id
WHERE cat.id = 3
-- add both the id and the incoming value
VALUES (`name.id`,'30'), (`name.id`,'50'), (name.id,'15')
LIMIT 0,3;

经过几次搜索后,我意识到在将数据插入表中时不能使用 SELECT 和 VALUES。

但我的方法是根据名称表中的 id + 来自表单的数据向此表添加数据。

所以我无法使用子查询找到解决方案。

有什么帮助吗!!

php sql mysql mysqli PDO

评论

1赞 Phil 7/10/2023
您可以在 中包含静态数据,但它们将是固定值,因此对于插入的每一行,它们都是相同的。有没有理由不先简单地查询,然后再进行插入?SELECT
0赞 nbk 7/10/2023
您使用的是哪个mysql版本?
0赞 Will B. 7/10/2023
请发布示例数据和所需的最终结果。
0赞 Ahmad Khaled 7/11/2023
@nbk,我使用的是 5.6 版,这是测试所需的版本。
0赞 Ahmad Khaled 7/11/2023
@WillB。一个例子可能最好检查任务模型,图像可能比我的描述解释得更好。但例如。如果用户选择家具;与其他 2 种类型不同,将发送 3 个值,高度 - 宽度 - 长度;仅发送 1 个值。这就是为什么它很棘手。因为我想发送所有值,并且每个相应的值都会从方案中发送到它们受关注的 id。我知道这有点令人困惑。但我正在尽可能多地寻求帮助。

答:

1赞 nbk 7/10/2023 #1

你可以这样做,因为你看到猫作为桌子是没有必要的

INSERT INTO `type_variants`(`var_name_id`, `values`)
-- select the id form variant names table
SELECT name.id, inval.val
FROM variant_name AS name CROSS JOIN (SELECT 30 as val UNION ALL SELECT 50 UNION SELECT 15) inval WHERE name.product_category_id = 3
LIMIT 0,3;
Table 'fiddle.type_variants' doesn't exist

小提琴

所以在考虑了你的问题之后,我瘦了你有如下的东西,然后你会像这样重写它

CREATE tABLe type_variants(`var_name_id` bigint, `values` int)
CREATE TABLE variant_name(id BIGINT AUTO_INCREMENT PRIMARY KEY, product_category_id BIGint)
INSERT INTO variant_name (product_category_id) VALUEs (3),(3),(3),(4),(4),(4),(5),(5),(5)
Records: 9  Duplicates: 0  Warnings: 0
INSERT INTO `type_variants`(`var_name_id`, `values`)
-- select the id form variant names table
SELECT name.id, inval.val
FROM (SELECT id, ROW_NUMBER() OVER( PARTITION BY product_category_id ORDER BY id) rn 
  FROM variant_name   WHERE product_category_id = 3)
  AS name INNER JOIN  (SELECT 30 as val, 1 as rn UNION ALL SELECT 50,2 UNION SELECT 15,3) inval 
ON name.rn = inval.rn

Records: 3  Duplicates: 0  Warnings: 0
SELECT * FROM type_variants
var_name_id
1 30
2 50
3 15
INSERT INTO `type_variants`(`var_name_id`, `values`)
-- select the id form variant names table
SELECT name.id, inval.val
FROM (SELECT id, ROW_NUMBER() OVER( PARTITION BY product_category_id ORDER BY id) rn 
  FROM variant_name   WHERE product_category_id IN (4,5))  AS name INNER JOIN  (SELECT 30 as val, 1 as rn UNION ALL SELECT 50,2 UNION SELECT 15,3) inval 
ON name.rn = inval.rn
Records: 6  Duplicates: 0  Warnings: 0
SELECT * FROM type_variants
var_name_id
1 30
2 50
3 15
4 30
5 50
6 15
7 30
8 50
9 15

小提琴

评论

0赞 Ahmad Khaled 7/15/2023
此命令仅将值 30 相加三次。
0赞 nbk 7/15/2023
交叉连接不会这样做,pkease 使用实际数据更改小提琴并在此处发布链接
0赞 nbk 7/15/2023
此外,ypu 应该删除限制子句@AhmadKhaled这是 ptobably 的原因 ehy 只有 3 行
0赞 Ahmad Khaled 7/16/2023
当我删除限制时,它最终会将每个值相加 3 次,因此最后的总记录数为 9。这不是我想要的。
0赞 nbk 7/16/2023
就像我说的,改变我的小提琴,用一个最小的可重复的例子来展示你的问题