【问题标题】:mysql query dynamic updatemysql查询动态更新
【发布时间】:2021-08-05 23:15:22
【问题描述】:

已解决

我有一个 mysql 表 (table1),其中包含许多具有单个 ID 的列。

表名: table1

:从“pt1 到 pt1000”

id = 1

  • 我有一个查询会更新列中的数据,一次更新 10 个数据
  • 我需要一个独特的动态查询,在每次提交时按顺序插入 10 个值。

示例

  1. 发送查询更新命令(来自 php 表单)

  2. 我在“pt1”到“pt10”的列中插入10个值

  3. 使用其他数据发送查询更新命令(来自同一个 php 表单)

  4. 我在“pt11”到“pt21”等列中插入10个值

问题:如何设置查询,以便它知道将值插入到正确的列中,而不是总是在相同的列中?

感谢大家的帮助

----------------- 编辑 --------------------- --------

我将手动(输入和选择值)从 php 表单传递到 php 查询页面并将这个值插入到变量中以构造动态查询。

例如:

在 PHP 形式中: 有两个选择

1 - 选择数据库(值 = "name_db_i_want_to_update")

2 - 选择列(值 = "1,2,3,4,5,6,7,etc")

在 PHP 查询页面中:

  1. 选择数据库值作为“$ db”
  2. 选择列作为“$ set”
  3. 带有查询集的IF 语句。 IF 列值 = 1 ELSE IF 等,$ setquery = pt1 = "value1","value2" 等。
  4. 构造动态查询(UPDATE $db SET $setquery WHERE id=1)

这不是最好的解决方案,作为编程逻辑当然也是错误的,但它确实有效。

感谢大家的帮助

【问题讨论】:

  • 你有没有尝试过?你到底卡在哪里了?
  • columns: from "pt1 to pt1000" - 这是一个设计不良的数据库的标志。您可能需要重新考虑您的方法。这些列代表什么?
  • 为什么你有 1000 列,而不是 10 + 一个表明你是否需要第一、第二、第三、第四……第 100 组字段的字段?
  • 我没有尝试过任何东西,因为我不知道该感觉如何。我有一个有效的查询更新,但手动预设值。因此,对于每个条目,我都必须手动更改查询。我曾想过用预设查询准备X php文件并通过php表单中的select调用正确的文件,我会解决它但它很麻烦并且需要很长时间。我不知道您是否可以设置更新查询以插入从第一列开始的值,例如没有空值??谢谢
  • 您遇到这些问题是因为您的数据库设计不好(这是轻描淡写的说法)。写入数据库不应该如此复杂或繁琐。你需要重组你的表。这些可能应该是不同表中的行,而不是列。但我只是猜测。

标签: php mysql forms phpmyadmin


【解决方案1】:

您应该将您的设计更改为类似于 mytable2 的东西,以收集数据将需要更多的 sql 编程,但以您需要的形式获取数据应该是一次性的。

如果您坚持保留您的设计,您可以使用像 blow 这样的存储过程来填充您的表格,但您必须知道所属的顺序,这也可以自动执行,如果您已经拥有另一个表格存储的填充数据位置 ,但是动态sql的基本原理是一样的。

CREATE TABLE mytable2(id int, pos int, value int)
INSERT INTO mytable2 VALUES (1,1,1),(1,2,2),(1,3,3),(1,4,4),(1,5,5),(1,6,6)
CREATE TABLE mytable(id int, pt1 int, pt2 int, pt3 int, pt4 int, pt5 int, pt6 int)
CREATE PROCEDURE `new_routine` (_id int, _sequence int, _pt1 int, _pt2 int,_pt3 int)
BEGIN

    IF _sequence = 0 then
       SET @sql := CONCAT('INSERT INTO mytable (id,pt1,pt2,pt3) VALUES (',_id,',',_pt1,',',_pt2,',',_pt3,')');
    ELSE
       SET @sql := CONCAT('UPDATE mytable SET pt',1 +((_sequence -1) * 3) ,'= ',_pt1
                          ,', pt',2 +((_sequence -1) * 3) ,'= ',_pt2
                          ,', pt',3 +((_sequence -1) * 3) ,'= ',_pt3,' WHERE id = ',_id);
    END IF;

    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END
CALL new_routine(1,0,1,1,1);
CALL new_routine(1,1,2,2,2)
CALL new_routine(1,2,3,3,3)
SELECT * FROM mytable
编号 | pt1 | pt2 | pt3 | pt4 | pt5 | pt6 -: | --: | --: | --: | --: | --: | --: 1 | 2 | 2 | 2 | 3 | 3 | 3
SELECT * FROM mytable2
编号 |位置 |价值 -: | --: | ----: 1 | 1 | 1 1 | 2 | 2 1 | 3 | 3 1 | 4 | 4 1 | 5 | 5 1 | 6 | 6

db小提琴here

【讨论】:

  • 感谢@nbk 的帮助!
猜你喜欢
  • 1970-01-01
  • 2018-12-15
  • 2023-03-16
  • 1970-01-01
  • 2015-04-26
  • 2017-08-10
  • 1970-01-01
  • 2015-10-01
  • 2019-01-23
相关资源
最近更新 更多