【问题标题】:Inserting same value from csv to empty rows using php使用php将相同的值从csv插入空行
【发布时间】:2021-08-14 10:55:13
【问题描述】:

大家好, 我想要一些关于使用 php 在 mysql 中上传这些数据的帮助。我不知道这个问题是否已经被问过,但我真的找不到答案,所以任何帮助将不胜感激。谢谢。

正如您在“来自 CSV 的数据”区域中看到的那样,我将如何上传数据,但描述中有空值,我需要使用 php 填写。如果文档相同,则描述也应该相同。

CSV Data VS Expected Result

【问题讨论】:

  • 使用 LOAD DATA INFILE 将 CSV 加载到表中,然后使用 UPDATE 填充空值。
  • 美好的一天,但我需要的是它在上传之前或之后自动填充那些空值..
  • 我需要的是它在上传之前或之后自动填充那些空值..这必须通过单独的查询来执行。

标签: php mysql csv upload


【解决方案1】:

您不需要 PHP。只需将 CSV 数据(使用您使用的任何工具或语言)导入到临时表中,然后您也可以使用 SQL 填补空白,最后将数据推送到主表中。这将使您从编码中解脱出来,并使整个过程更加高效和快速。

...Code to import CSV data to temporary table

UPDATE tmp_data
SET description = document
WHERE description = '' OR description IS NULL;

INSERT INTO main_data (account, document, description) 
SELECT account, document, description FROM tmp_data;

【讨论】:

  • 美好的一天,谢谢你的帮助,我已经尝试过你的代码,但描述部分的结果是 document_no 是“123”,我需要它显示“Description 1”,因为例如,如果 document_no 行等于“123”,那么空的 Description 应该是 =“Description 1”。
  • SET description = CONCAT('Description', document)
【解决方案2】:

进口:

LOAD DATA INFILE
INTO TABLE tmp_table
{ importing options }
(AccountName, DocumentNo, Description);

更新:

UPDATE tmp_table t1
JOIN tmp_table t2 USING (AccountName, DocumentNo)
SET t1.Description = t2.Description
WHERE t2.Description > '';

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=22c292e88fa4f9edae1c767bf81f070a

对于每个 (AccountName, DocumentNo) 对值,Description 中必须只有一个不同的非空值(即,允许多行具有非空值,但所有这些值必须相同)。如果不是,则输出是不可预测的,此外,在某些行中,一个非空值可能会被另一个非空值替换。


当然,这一切都可以通过一个(正式的)查询来完成。

您可以使用 ENGINE = CSV 选项将 CSV 文件作为表格附加,然后使用将数据复制到其中

INSERT INTO tmp_table (AccountName, DocumentNo, Description)
SELECT AccountName, DocumentNo, t2.Description
FROM csv_table t1
JOIN csv_table t2 USING (AccountName, DocumentNo)
WHERE t2.Description > '';

但您的 CSV 必须包含在导入期间必须忽略的前缀行。

对于每个 (AccountName, DocumentNo) 对值,Description 中必须只有一个非空值。如果不是,那么tmp_table 中的行数将成倍增加。但是您可以编辑查询并将 csv_table t2 替换为根据每个 (AccountName, DocumentNo) 对值区分 Description 值的子查询。

【讨论】:

  • 谢谢先生!像魅力一样工作。虽然在处理数千个数据时有点慢,但它确实回答了我的问题。谢谢先生。
  • @DemBautista 上千条数据使用有点慢 数据导入后创建相应的索引,会改善UPDATE。在第二个选项中 - 没有任何帮助。
  • 先生,我应该索引哪个?
  • @DemBautista CREATE INDEX idx ON tmp_table (AccountName, DocumentNo);
  • 非常感谢您,先生,您是救生员。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 2013-12-27
  • 2015-01-19
  • 1970-01-01
相关资源
最近更新 更多