Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将多行转换为一行的最有效方法_Php_Mysql_Sql - Fatal编程技术网

Php 将多行转换为一行的最有效方法

Php 将多行转换为一行的最有效方法,php,mysql,sql,Php,Mysql,Sql,我有一个表,其中插件保存所有表单提交,在该表中,我为每个字段设置了一行,如下所示: 1 'Name' 'Tony' 2 'Surname' 'Smith' 3 'Mail' 'tony@mail.com' 4 etc. New_Id Name Surname Mail 1 'Tony' 'Smith' 'tony@mail.com' 2 'Mary' 'DotCom' 'mary@dotcom' 我想将所有这些数据放到一个表中,其中所有数据都在列中,如下所示: 1

我有一个表,其中插件保存所有表单提交,在该表中,我为每个字段设置了一行,如下所示:

1 'Name' 'Tony'
2 'Surname' 'Smith'
3 'Mail' 'tony@mail.com'
4 etc.
New_Id Name   Surname  Mail
     1 'Tony' 'Smith'  'tony@mail.com'
     2 'Mary' 'DotCom' 'mary@dotcom'
我想将所有这些数据放到一个表中,其中所有数据都在列中,如下所示:

1 'Name' 'Tony'
2 'Surname' 'Smith'
3 'Mail' 'tony@mail.com'
4 etc.
New_Id Name   Surname  Mail
     1 'Tony' 'Smith'  'tony@mail.com'
     2 'Mary' 'DotCom' 'mary@dotcom'
我有很多这样的记录,所以效率很重要。我的第一种方法是对第一个表中的每个字段进行PHP循环,然后决定是否必须在第二个表中插入或更新,此解决方案甚至可能需要之前的select来查看字段是否已填充,因此解决方案不是很好

你能想出更好的解决办法吗

编辑:这是我的结构:

这是我的目标表,字段名是西班牙语,但它们是名称、出生日期、地址等

create table target_table
    (id     int not null AUTO_INCREMENT,
    blog_id     int,
    submission_id   int,
    form_id     varchar(250) character set utf8 collate utf8_general_ci,
    submission_date timestamp,
    ip      varchar(250) character set utf8 collate utf8_general_ci,
    sitio           varchar(250) character set utf8 collate utf8_general_ci,
    nombre      varchar(4000) character set utf8 collate utf8_general_ci,
    fecha_nacimiento varchar(250),
    email           varchar(250) character set utf8 collate utf8_general_ci,
    direccion       varchar(250) character set utf8 collate utf8_general_ci,
    cp          varchar(250) character set utf8 collate utf8_general_ci,
    PRIMARY KEY(id));
来源实际上是两个表,cforms_submissions是父表,具有提交id、提交日期和电子邮件:

id               int(11) unsigned PK
form_id          varchar(3)
sub_date         timestamp
email            varchar(40)
ip               varchar(15)
cforms_数据是包含字段及其值的子表:

f_id             int(11) unsigned PK
sub_id           int(11) unsigned <---- This is FK to parent
field_name       varchar(100)
field_val        text
也许有更好的方法吗


谢谢你,顺便说一句,我正在使用MySql,对不起,我误解了这个问题。 只要表的数量有限,就可以按以下方式进行N个联接:

INSERT_INTO target_table(blog_id, form_id, ....) 
SELECT id, ..., name_table.field_val, address_table, ... 
FROM cforms_data name_table INNER JOIN cforms_data address_table 
    ON  name_table.sub_id = address_table.sub_id 
    INNER JOIN cforms_data date_table ON name_table.sub_id = name_table.sub_id
    INNER JOIN ...
WHERE name_table.field_name = 'NAME' AND address_table.field_name = 'ADDRESS' AND...
您所做的是为目标中的每个字段获取与源中该字段匹配的条目子集,并为那些与具有相同ID的其他子集中的字段匹配的条目子集。 由于每个字段都有一个别名,因此查询的时间将非常长,但如果索引正确(可能是在字段名、子字段id上),性能应该不会太差。我认为您可以在表单中添加字段名称比较,但我不确定这是MySQL还是Oracle。 你可能需要家长发邮件,但我觉得这很琐碎

原件:

只需在MySql中执行

插入目标_表(blog_id,form_id…)选择id,form_id,, ...., ... 从cforms_提交内部连接id上的cforms_数据== sub_id具有最大值(sub_日期)


我假设您要插入最后一条记录。否则,相应地改变选择。“插入到”中的字段必须与“选择”中的字段相匹配。

当前记录是如何链接的?例如,你怎么知道
'Name'->'Tony'
'Name'->'Smith'
有关联?至少你不再使用EAV了。了解您当前的设计将很有帮助,,,表单字段列表是否有限且已定义?也就是说,系统或用户不能添加任意的新密钥?您是否正在寻找一种允许您一次性初始化目标_表的解决方案?也许插件正在被替换?或者,您是否要求一个程序化解决方案以持续的方式执行此任务?如果是前者,我想我应该从规范化cforms_提交和cforms_数据开始。jklemmack:表单字段列表是有限的并且已经定义了吗?->是的,你能提供更多关于这个问题的细节吗?我认为这对于提交来说是可以的,但我关心的是cforms_数据中的每个字段……查询中的每个内部连接行都处理目标表中的一个命名字段,只选择那些按名称匹配且具有与父级相同提交ID的字段。例如,为了获得
地址
,您再次加入整个cforms\u数据表,选择那些具有匹配sub\u id和字段\u name='address'的记录。如果缺少某些字段,则可以使用左连接而不是内部连接,并且这些字段在结果中将为空。